So geben Sie eine generische Python -Signatur zum Rückgabetyp an und verwenden Sie den Typ in der Funktion

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: So geben Sie eine generische Python -Signatur zum Rückgabetyp an und verwenden Sie den Typ in der Funktion

by Anonymous » 17 Mar 2025, 00:39

Ich versuche, eine Funktion zu schreiben, die eine Klasse als Argument nimmt, eine Instanz dieser Klasse zurückgibt, die in einen anderen Typ eingewickelt ist, und verwendet den Typ der Klasse zum internen Gießen. Es funktioniert mit einem einfachen Typ wie STR, aber nicht einer tatsächlichen Klasse. PrettyPrint-Override ">

Code: Select all

from typing import cast, Type, TypeVar, Generic, Optional, Any
from pydantic import BaseModel, UUID4
from typing_extensions import Annotated, TypeAliasType
from pydantic.functional_validators import BeforeValidator
from uuid import UUID

def api_fn(output_cls: Optional[Type[BaseModel]] = None):
return None # simplified for example code, signature cannot be changed, not my code

def amount_f(v: Any) -> float:
return 0.0 # simplified for example code

MyNumber = Annotated[float, BeforeValidator(amount_f)]

DataT = TypeVar('DataT')
class TypeWithId(BaseModel, Generic[DataT]):
value: DataT
id: UUID4

T = TypeVar('T')
OptionalWithId = TypeAliasType(
'OptionalWithId', Optional[TypeWithId[T]], type_params=(T,)
)

OutT = TypeVar('OutT')
def query(output_cls:Type[OutT]) -> OptionalWithId[OutT]:
ret = api_fn(output_cls=output_cls)
return TypeWithId(value=cast(OutT,ret), id=UUID('00000000-0000-0000-0000-000000000000'))

str_result = query(str)
print(str_result)
number_result = query(MyNumber)
print(number_result)
Die str_result funktioniert, aber die number_result gibt mir:

Code: Select all

   27  26 error    e-f-b    Pyright [reportArgumentType]: Argument of type "type[OutT@query]" cannot be assigned to parameter "output_cls" of type "type[BaseModel] | None" in function "api_fn"
32   0 error    e-f-b    Pyright [reportUnknownVariableType]: Type of "number_result" is partially unknown
32  22 error    e-f-b    Pyright [reportArgumentType]: Argument of type "MyNumber" cannot be assigned to parameter "output_cls" of type "type[OutT@query]" in function "query"
33   6 error    e-f-b    Pyright [reportUnknownArgumentType]: Argument type is partially unknown

Top