Warum funktioniert Annotated[str, T] nicht, während Annotated[T, str] gut funktioniert?

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Warum funktioniert Annotated[str, T] nicht, während Annotated[T, str] gut funktioniert?

by Guest » 14 Jan 2025, 10:55

Ich habe ein Projekt, bei dem Benutzer häufig Annotated[str, MyType()] verwenden müssen. Um es zu vereinfachen, versuche ich, einen generischen Typ zu erstellen

Code: Select all

T = TypeVar('T')
CustomUrl = Annotated[str, T]
Aber ich erhalte diese Fehlermeldung, wenn ich versuche, es auf diese Weise zu verwenden:

Code: Select all

CustomUrl[MyData()]

# TypeError: typing.Annotated[str, ~T] is not a generic class
Ich habe keine Ahnung, warum das passiert, und es funktioniert gut, wenn ich die Reihenfolge umkehre zu

Code: Select all

CustomUrl[T, str]
Aber das ist nicht das, was ich will. Gibt es eine Möglichkeit, es zum Laufen zu bringen?
Mein Anwendungsfall besteht darin, dass der Benutzer eine Datenklasse deklariert und automatisch ein UI-Schema generiert wird, zum Beispiel
< pre class="lang-py Prettyprint-override">

Code: Select all

# pseudo code

@dataclass
class TaskArgs:
input_text: Annotated[str, {'multiline': True}]
input_file: Annotated[str, {'multifiles': True}]
Update
Ich habe die folgende Antwort ausprobiert:

Code: Select all

from typing import Annotated, TypeVar

T = TypeVar('T')

class CustomeUrl(Annotated[str, T]):
...

c: CustomeUrl = 's'
Das Problem ist, dass der letzte Ausdruck den Fehler auslöst:

Code: Select all

Expression of type "Literal['s']" is incompatible with declared type "CustomeUrl"
"Literal['s']" is incompatible with "CustomeUrl"
Der Grund, warum ich mich für Annotated entschieden habe besteht darin, sicherzustellen, dass die Typprüfung gültig ist, sodass ich nicht glaube, dass sie mein Problem löst.

Top