Seite 1 von 1
Variable ohne einfache Anführungszeichen ausgeben
Verfasst: Freitag 1. November 2013, 13:31
von imho74
Hallo,
ich hänge gerade an einem Problem, zudem ich einfach keine Lösung finde:
Ich habe folgende Tuple:
Die ich ohne Klammern weiterverarbeiten will:
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?
Vermutlich ist es nur eine Kleinigkeit, aber ich habe gerade einfach ein Brett vor dem Kopf.
Vielen Dank und viele Grüße,
Christian
Re: Variable ohne einfache Anführungszeichen ausgeben
Verfasst: Freitag 1. November 2013, 13:59
von cofi
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.
Re: Variable ohne einfache Anführungszeichen ausgeben
Verfasst: Freitag 1. November 2013, 14:02
von 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.
Re: Variable ohne einfache Anführungszeichen ausgeben
Verfasst: Freitag 1. November 2013, 14:13
von diesch
Bei
siehst du eine String-Respräsentation von newvar, wie sie
erzeugt.
Bei
siehst du eine String-Respräsentation von newvar, wie sie
erzeugt.
Für Strings ist die Ausgabe von str() "zufällig" mit dem tatsächlichen Wert identisch - das gilt allgemein aber nicht.
Re: Variable ohne einfache Anführungszeichen ausgeben
Verfasst: Freitag 1. November 2013, 14:40
von imho74
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.
Re: Variable ohne einfache Anführungszeichen ausgeben
Verfasst: Freitag 1. November 2013, 14:49
von 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.
Re: Variable ohne einfache Anführungszeichen ausgeben
Verfasst: Freitag 1. November 2013, 15:42
von imho74
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.