Seite 1 von 1
Einschränkungen auf eine Eingabe einer Funktion hinzufügen ?
Verfasst: Donnerstag 6. Juli 2017, 14:29
von AntoineP
Hallo, ich möchte lernen wie man eine Einschränkung auf eine Eingabe einer Funktion hinzufügen.
Zum Beispiel möchte ich das Spaltenargument immer sein ein
String oder Äquivalent.
Re: Einschränkungen auf eine Eingabe einer Funktion hinzufügen ?
Verfasst: Donnerstag 6. Juli 2017, 14:35
von Sirius3
@AntoineP: Normalerweise dokumentiert man im doc-String, was für Argumente die Funktion erwartet. Und dann rufst Du die Funktion einfach nur mit Strings oder ähnlichem auf. Ist das nicht Einschränkung genug? queryShaping sollte query_shaping heißen.
Re: Einschränkungen auf eine Eingabe einer Funktion hinzufügen ?
Verfasst: Donnerstag 6. Juli 2017, 14:36
von __deets__
Das ist in Python unueblich. Python nutzt "Duck-Typing" - wenn etwas so laeuft und quackt wie eine Ente, ist es eine Ente. Man prueft das nicht vorher ab, weil es den Benutzer gegebenenfalls einschraenkt.
Klassisches Beispiele dafuer aus der Standardbibliothek ist (c)StringIO, dessen Objekte so tun, als ob sie Dateien waeren - aber komplett aus dem Speicher kommen. Wenn du jetzt auf 'file' pruefen wuerdest, koennte man diese Objekte nicht mehr nutzen:
Code: Alles auswählen
>>> from cStringIO import StringIO
>>> foo = StringIO()
>>> isinstance(foo, file)
False
Womit auch gezeigt wurde, wie man eine solche Pruefung macht. Aber nochmal: bitte mach es nicht.
Re: Einschränkungen auf eine Eingabe einer Funktion hinzufügen ?
Verfasst: Donnerstag 6. Juli 2017, 16:49
von AntoineP
ich hab verstanden ! Danke sehr !
Re: Einschränkungen auf eine Eingabe einer Funktion hinzufügen ?
Verfasst: Donnerstag 6. Juli 2017, 22:11
von snafu
Das mit Duck Typing ist sicherlich richtig, aber falls man seine API doch etwas statischer haben möchte, dann ist sicherlich enforce.py einen Blick wert. Hier ein Beispiel aus der
Doku:
Code: Alles auswählen
>>> import enforce
>>>
>>> @enforce.runtime_validation
... def foo(text: str) -> None:
... print(text)
>>>
>>> foo('Hello World')
Hello World
>>>
>>> foo(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/william/.local/lib/python3.5/site-packages/enforce/decorators.py", line 106, in universal
_args, _kwargs = enforcer.validate_inputs(parameters)
File "/home/william/.local/lib/python3.5/site-packages/enforce/enforcers.py", line 69, in validate_inputs
raise RuntimeTypeError(exception_text)
enforce.exceptions.RuntimeTypeError:
The following runtime type errors were encountered:
Argument 'text' was not of type <class 'str'>. Actual type was <class 'int'>.
Zu beachten ist, dass übermäßige Type Checks natürlich auch auf die Laufzeit gehen.