Einschränkungen auf eine Eingabe einer Funktion hinzufügen ?

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
AntoineP
User
Beiträge: 23
Registriert: Donnerstag 6. Juli 2017, 10:57

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.

Code: Alles auswählen

def queryShaping(liste,column):
Zuletzt geändert von Anonymous am Donnerstag 6. Juli 2017, 14:41, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
AntoineP
User
Beiträge: 23
Registriert: Donnerstag 6. Juli 2017, 10:57

ich hab verstanden ! Danke sehr !
Benutzeravatar
snafu
User
Beiträge: 6881
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Antworten