Jython/Sikulix: Ermittlung des Types
Ich hab hier gerade das Problem, dass ich ermitteln muss welcher Type einer Routine übergeben wurde. Denn manchmal ist das data.x/data.y und für andere Datentypen data.getTarget().x/data.getTarget().y Leider wirft mir schon type(...) was unerwartetes aus: match = region.find(pattern) print type(match) if type(match) is Match: print "Match" else: print "was anderes" Ausgabe: [error] TypeError (type(): 1st arg can't be coerced to String) Wenns hier nicht passt, Verweise auf andere Listen/Gruppen/Foren werden gerne entgegengenommen (bevorzugt deutschsprachig) Bernd
Bitte liefere vollständigen Beispielcode, den man selber reproduzieren kann. Niemand muss raten was region und pattern für Daten sind... Regards Andreas Jung ----- Sorry for being brief - sent from a mobile device.
Am 11.01.2014 um 03:18 schrieb Bernd Hohmann <bernd.hohmann.20111111@freihaendler.com>:
Ich hab hier gerade das Problem, dass ich ermitteln muss welcher Type einer Routine übergeben wurde. Denn manchmal ist das data.x/data.y und für andere Datentypen data.getTarget().x/data.getTarget().y
Leider wirft mir schon type(...) was unerwartetes aus:
match = region.find(pattern) print type(match) if type(match) is Match: print "Match" else: print "was anderes"
Ausgabe:
[error] TypeError (type(): 1st arg can't be coerced to String)
Wenns hier nicht passt, Verweise auf andere Listen/Gruppen/Foren werden gerne entgegengenommen (bevorzugt deutschsprachig)
Bernd
_______________________________________________ python-de maillist - python-de@python.org https://mail.python.org/mailman/listinfo/python-de
Bernd Hohmann wrote:
Ich hab hier gerade das Problem, dass ich ermitteln muss welcher Type einer Routine übergeben wurde. Denn manchmal ist das data.x/data.y und für andere Datentypen data.getTarget().x/data.getTarget().y
Leider wirft mir schon type(...) was unerwartetes aus:
match = region.find(pattern) print type(match) if type(match) is Match: print "Match" else: print "was anderes"
Ausgabe:
[error] TypeError (type(): 1st arg can't be coerced to String)
Was Andreas sagt... zumal es sich dabei wohl um eine Jython-spezifische Fehlermeldung handelt. Allgemein gesprochen kommst du möglicherweise ohne explizite Typprüfung aus: try: getTarget = data.getTarget except AttributeError: target = data else: target = getTarget() print target.x / target.y Alternativ: try: result = data.x / data.y except AttributeError: result = data.getTarget().x / data.getTarget().y print result
Bernd Hohmann wrote:
Ich hab hier gerade das Problem, dass ich ermitteln muss welcher Type einer Routine übergeben wurde. Denn manchmal ist das data.x/data.y und für andere Datentypen data.getTarget().x/data.getTarget().y
Leider wirft mir schon type(...) was unerwartetes aus:
match = region.find(pattern) print type(match) if type(match) is Match: print "Match" else: print "was anderes"
Ausgabe:
[error] TypeError (type(): 1st arg can't be coerced to String)
Google sagt: dein type() ist nicht das built-in, sondern http://doc.sikuli.org/region.html#Region.type das einen String als erstes Argument erwartet. Deshalb hier der Hinweis: Star-imports from whatever import * sind nur was für Leute, die wissen, was sie tun -- und die verzichten in der Regel freiwillig darauf ;)
Bernd Hohmann wrote:
Ich hab hier gerade das Problem, dass ich ermitteln muss welcher Type einer Routine übergeben wurde. Denn manchmal ist das data.x/data.y und für andere Datentypen data.getTarget().x/data.getTarget().y
Leider wirft mir schon type(...) was unerwartetes aus:
match = region.find(pattern) print type(match) if type(match) is Match: print "Match" else: print "was anderes"
Ausgabe:
[error] TypeError (type(): 1st arg can't be coerced to String)
Ach, und wenn's eine Typprüfung sein soll: if isinstance(match, Match): print "Match" else: print "was anderes" Das ist in der Regel spezifisch genug.
Hi, On 2014-01-11 10:04, Peter Otten wrote:
Allgemein gesprochen kommst du möglicherweise ohne explizite Typprüfung aus:
try: getTarget = data.getTarget except AttributeError: target = data else: target = getTarget()
print target.x / target.y
Wenn man das an vielen Stellen braucht, kann man das wiederum in einer Funktion verpacken, also etwas wie def x(data): try: getTarget = data.getTarget except AttributeError: target = data else: target = getTarget() return target.x x1 = x(objekt_mit_getTarget) x2 = x(objekt_ohne_getTarget) und entsprechend für `y`. Die Namen `x` und `y` für die Funktionen sind hier vielleicht zu knapp und könnten mit Namen für x- und y-_Werte_ kollidieren. Wenn es bei den beiden `data`-Varianten noch mehr solche Unterschiede gibt, könntest du Klassen einzuführen, so dass du die neuen "eingepackten" Objekte die gleiche Schnittstelle haben. Hier eine Skizze: class DataWithGetTargetAdapter(object): def __init__(self, object_with_getTarget): self._object_with_getTarget = object_with_getTarget def x(self): return self._object_with_getTarget.getTarget().x # More methods to unify the interfaces ... class DataWithoutGetTargetAdapter(object): def __init__(self, object_without_getTarget): self._object_without_getTarget = object_without_getTarget def x(self): return self._object_without_getTarget.x # More methods to unify the interfaces ... Du kannst damit die ursprünglichen Objekte je nach Ausgangstyp "einpacken" und auf diesen neuen Objekten einfach `x()` aufrufen, ohne weitere Fallunterscheidungen. Falls du nur ein relativ einfaches Programm hast oder du dich nicht so gut mit OOP auskennst, dürfte das aber Overkill sein und ich würde dir einen einfacheren Ansatz wie die obigen Funktionen empfehlen. Viele Grüße Stefan
participants (4)
-
Andreas Jung
-
Bernd Hohmann
-
Peter Otten
-
Stefan Schwarzer