我有這樣的課:
from typing import Generic, TypeVar
from pydantic import BaseModel
T = TypeVar("T", bound=BaseModel)
class A(Generic[T]):
def some_method(self) -> T:
... # some data processing
return T.from_orm(some_data_model)
# in tests package:
class Model(BaseModel): ...
A[Model].some_method()
assert Model.from_orm.called_once
但它不作業,因為T是不是一個真正的型別(BaseModel),但只有TypeVar那個邊界來BaseModel。
所以問題是:我怎樣才能得到真正的(替代的)型別T?
重要筆記:
方法是什么型別對我來說無關緊要(類方法,物件實體的方法或靜態方法)
我的python版本是3.8
這個答案對我沒有幫助:
我試過這個:
from typing import ..., get_args
# ...
def some_method(self) -> T:
...
return get_args(type(self))[0].from_orm(some_data_model)
這個:
from typing import ..., get_args
# ...
@classmethod
def some_method(cls) -> T:
...
return get_args(cls)[0].from_orm(some_data_model)
和這個:
from typing import ..., get_args
# ...
@classmethod
def some_method(cls) -> T:
...
return get_args(A)[0].from_orm(some_data_model)
我以這種方式呼叫它(如果它是類/靜態方法):
A[Model].some_method()
如果是實體方法:
A[Model]().some_method()
所有這一切(沒有呼叫from_orm和獲取索引 0)只回傳空元組,整個方法以IndexError(這是完全正確的)結束。
uj5u.com熱心網友回復:
在評論中@alex_noname 發布了另一個此類問題的鏈接。
就我而言,答案是使用物件的__orig_class__屬性self:
from typing import Generic, TypeVar, get_args
from pydantic import BaseModel
T = TypeVar("T", bound=BaseModel)
class A(Generic[T]):
def some_method(self) -> T:
... # some data processing
return get_args(self.__orig_class__)[0].from_orm(some_data_model)
有關更多資訊,請參閱此答案
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/363418.html
上一篇:C#-將泛型委托轉換為非泛型委托
