Variable ohne einfache Anführungszeichen ausgeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
imho74
User
Beiträge: 11
Registriert: Sonntag 15. Juni 2008, 21:49

Hallo,

ich hänge gerade an einem Problem, zudem ich einfach keine Lösung finde:

Ich habe folgende Tuple:

Code: Alles auswählen

>>> var = 1,2,3,4
>>> var
(1, 2, 3, 4)
Die ich ohne Klammern weiterverarbeiten will:

Code: Alles auswählen

>>> newvar = str(var)[1:-1]
>>> newvar
'1, 2, 3, 4'
Die Funktion, die den Wert von newvar entgegennimmt, verträgt nämlich keine Klammern, aber auch keine Anführungszeichen. Wie kann ich ihr newvar ohne Anführungszeichen übergeben, also so, wie die Ausgabe mit print ist?

Code: Alles auswählen

>>> print newvar
1, 2, 3, 4
Vermutlich ist es nur eine Kleinigkeit, aber ich habe gerade einfach ein Brett vor dem Kopf.

Vielen Dank und viele Grüße,

Christian
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Zu deinem Problem wirst du keine Loesung finden, denn es ist kein Problem.

`var` ist ein Tupel, dass die Ausgabe mit Klammern umgeben ist, repraesentiert nur, dass es ein Tupel ist (genauso wie eckige Klammern wie bei Listen).
Genauso hat `new_var` keine Anfuehrungszeichen, die repraesentieren hier, dass es ein String ist.

Zu guter Letzt: `print` zeigt keine Anfuehrungszeichen, weil es keinen Grund gibt auszuzeichnen, dass es ein String ist.

Das sind absolute Grundlagen, also nochmal ran ans Tutorial.
Wenn du Hilfe willst, dann zeige uns dein _eigentliches_ Problem.
BlackJack

@imho74: Du bringst hier gerade ganz kräftig Zeichenkettendarstellungen von Werten und den tatsächlichen Werte durcheinander. Dein ``str(var)[1:-1]`` ist ein unschöner Hack, um es mal freundlich auszudrücken. Der saubere Weg wäre es die einzelnen Werte in dem Tupel in Zeichenketten umzuwandeln und mit ', ' und der `join()`-Methode zusammenzusetzen.

`newvar` enthält auch keine Anführungszeichen. Also was immer die Funktion nicht mag der Du den Wert übergibst, an Anführungszeichen kann es nicht liegen. Die sind nur Teil der `repr()`-Darstellung die von der Python-Shell für die Ausgabe verwendet wird, damit man sehen kann was die Zeichenkette tatsächlich enthält, zum Beispiel Leerzeichen am Ende, und damit man solche Werte kopieren und in Quelltext einfügen kann.
Benutzeravatar
diesch
User
Beiträge: 80
Registriert: Dienstag 14. April 2009, 13:36
Wohnort: Brandenburg a.d. Havel
Kontaktdaten:

Bei

Code: Alles auswählen

>>> newvar
'1, 2, 3, 4'
siehst du eine String-Respräsentation von newvar, wie sie

Code: Alles auswählen

repr(newvar)
erzeugt.

Bei

Code: Alles auswählen

>>> print newvar
1, 2, 3, 4
siehst du eine String-Respräsentation von newvar, wie sie

Code: Alles auswählen

str(newvar)
erzeugt.

Für Strings ist die Ausgabe von str() "zufällig" mit dem tatsächlichen Wert identisch - das gilt allgemein aber nicht.
http://www.florian-diesch.de
Benutzeravatar
imho74
User
Beiträge: 11
Registriert: Sonntag 15. Juni 2008, 21:49

Hallo zusammen,

Vielen Dank für eure Erklärungen. Das eigentliche Problem liegt an der Übergabe einer Zahlen-Reihe an eine Excel-Funktion in IronPython:

Code: Alles auswählen

IronPython 2.7.4 (2.7.0.40) on .NET 4.0.30319.18052 (32-bit)
Type "help", "copyright", "credits" or "license" for more information.
>>> from System import Activator, Type
>>> excel = Activator.CreateInstance(Type.GetTypeFromProgID('Excel.Application')
)
>>> wf = excel.WorksheetFunction
>>> data = 1,2,3,4
>>> data
(1, 2, 3, 4)
>>> wf.Median(1,2,3,4)
2.5
>>> wf.Median(data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Could not convert argument 0 for call to Median.
>>> data = str(data)[1:-1]
>>> data
'1, 2, 3, 4'
>>> wf.Median(data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
EnvironmentError: System.Runtime.InteropServices.COMException (0x800A03EC): Die
Median-Eigenschaft des WorksheetFunction-Objektes kann nicht zugeordnet werden.
   at Microsoft.Scripting.ComInterop.ComRuntimeHelpers.CheckThrowException(Int32
 hresult, ExcepInfo& excepInfo, UInt32 argErr, String message)
   at CallSite.Target(Closure , CallSite , Object , Object )
   at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site
, T0 arg0, T1 arg1)
   at CallSite.Target(Closure , CallSite , Object , Object )
   at Microsoft.Scripting.Interpreter.DynamicInstruction`3.Run(InterpretedFrame
frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run4[T0,T1,T2,T3,TRet](T0 arg0
, T1 arg1, T2 arg2, T3 arg3)
   at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite s
ite, T0 arg0, T1 arg1, T2 arg2)
   at Microsoft.Scripting.Interpreter.FuncCallInstruction`6.Run(InterpretedFrame
 frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run4[T0,T1,T2,T3,TRet](T0 arg0
, T1 arg1, T2 arg2, T3 arg3)
   at IronPython.Compiler.Ast.CallExpression.Invoke1Instruction.Run(InterpretedF
rame frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,TRet](T0 arg0, T1 a
rg1)
   at IronPython.Compiler.PythonScriptCode.RunWorker(CodeContext ctx)
   at IronPython.Compiler.PythonScriptCode.Run(Scope scope)
   at IronPython.Hosting.PythonCommandLine.<>c__DisplayClass1.<RunOneInteraction
>b__0()
>>>
Ich sehe das so, dass die Methode Median() ein Problem mit dem Wert von data hat. Nur was? :K

Achso, P.S. Das ist jetzt die Darstellung des urpsrünglichen Problems, "str(data)[1:-1]" würde ich jetzt nicht mehr so verwenden.
BlackJack

@imho74: Die Funktion möchte offensichtlich nicht *ein* Argument sondern alle Zahlen als einzelne Argumente. Das Du versuchst eine Zeichenkette zu übergeben die so aussieht wie einzelne Argumente verstärkt den Verdacht, dass Du Werte und ihre Darstellung durcheinander bringst. Eine Zeichenkette die so aussieht wie die Darstellung eines anderen Wertes als Zeichenkette ist nicht das selbe wie der Wert, sondern eben nur eine Darstellung als Zeichenkette. Versuch mal ``wf.Median(*data)`` und schau in der Python-Dokumentation nach was der ``*`` beim Funktionsaufruf bedeutet.
Benutzeravatar
imho74
User
Beiträge: 11
Registriert: Sonntag 15. Juni 2008, 21:49

Ok, ich sehe jetzt das Problem.

Code: Alles auswählen

>>> var = [3,6]
>>> var
[3, 6]
>>> range(var)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: range() integer end argument expected, got list.
>>> range(*var)
[3, 4, 5]
Unpacking Argument Lists: Durch den * werden alle Zahlen als einzelne Argumente übergeben.

Vielen Dank für die Hilfe.
Antworten