Wie ich heute bemerkt habe, verwendet das Python 3.10-Inspektionsmodul jetzt typing.get_type_hints (), um Typen zu interpretieren. Das entsprechende Commit lautet hier ist.
Dies scheint ein Fix im Zusammenhang mit der verzögerten Auswertung von Anmerkungen zu sein, die standardmäßig ab Python 3.10 aktiviert sind. Da die in obj .__ annotations__
gepackten Typanmerkungsinformationen zu einer Zeichenfolge werden, kann beurteilt werden, dass es angemessen ist, sie typing.get_type_hints ()` zu überlassen.
Mit dieser Änderung werden die Typinformationen von "inspect.signature ()", die sich einfach auf "obj .__ annotations__" beziehen, auf das Analyseergebnis umgeschaltet, das einen Schritt weiter geht.
In Python 3.9 wird beispielsweise das folgende Funktionsargument "hello ()" name "als" str "-Typ behandelt.
$ python3.9
Python 3.9.0 (default, Oct 24 2020, 15:41:29)
[Clang 11.0.3 (clang-1103.0.32.59)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def hello(name: str = None):
... print("Hello ", name)
...
>>> import inspect
>>> inspect.signature(hello)
<Signature (name: str = None)>
In Python 3.10 (in Entwicklung) wird es hingegen als optionaler Typ [str] betrachtet. Da das Standardargument "Keine" lautet, wird ein besserer Typ zurückgegeben.
$ python3.10
Python 3.10.0a1+ (heads/master:805ef73, Oct 24 2020, 15:07:19)
[Clang 11.0.3 (clang-1103.0.32.59)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def hello(name: str = None):
... print("Hello ", name)
...
>>> import inspect
>>> inspect.signature(hello)
<Signature (name: Optional[str] = None)>
Übrigens, wenn der Name zur Laufzeit nicht aufgelöst werden kann (z. B. wenn "typing.TYPE_CHECKING" zur Laufzeit nicht importiert wird), wird auf "obj .__ Signatur__" wie zuvor verwiesen, sodass sich das Interpretationsergebnis je nach Anmerkung ändern kann.
$ python3.10
Python 3.10.0a1+ (heads/master:805ef73, Oct 24 2020, 15:07:19)
[Clang 11.0.3 (clang-1103.0.32.59)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def hello(name: Unknown, age: int = None): pass
...
>>> import inspect
>>> inspect.signature(hello)
<Signature (name: 'Unknown', age: 'int' = None)>
In diesem Fall kann der Typ "Unbekannt" nicht aufgelöst werden, daher ist der Typ des Arguments "Alter" nur "int" anstelle von "Optional [int]".
Recommended Posts