假设有一个方法:
def train_model(self, out_dir='./out/',
test_size=0.2, train_size=None,
random_state=None, shuffle=True, stratify=None,
epochs=DEFAULT_EPOCHS, batch_size=DEFAULT_BATCH_SIZE):
...
self.model.train(test_size=test_size, train_size=train_size, random_state=random_state, shuffle=shuffle, stratify=stratify, epochs=epochs, batch_size=batch_size)
在这个函数中,还会调用另一个具有相同签名的方法,然后我必须手动传递所有参数。我不想在 train_model
中使用 kwargs
,因为它是一个可能被其他人使用的公共方法,所以我希望保留类型信息。我不知道是否有方法可以允许我在外部函数的 kwargs 中保留类型信息。
在 TypeScript 中,可以使用 Parameters 实用类型来实现相同的功能。例如:
function sum(a: int, b: int) {
return a + b;
}
type SumParamsType = Paramters<typeof sum>
// Then you can use the SumPramsType in other places.
一个Python失败的示例:
from typing import TypeVar
T = TypeVar('T')
def f1(a=1, b=2, c=3):
return a+b+c
# Is there anything like T=Parameters(type(f1)) in Python?
def f2(z=0, **kwargs: T):
return z+f1(**kwargs)
# T cannot capture the kwargs of f1 (of course it won't)
这也不起作用:
def f1(a=1, b=2, c=3):
return a+b+c
def f2(z=0, **kwargs: f1.__annotations__['kwargs']):
return z + f1(**kwargs)
# kwargs has the type Any
**kwargs
,而是在train_model
中重用self.model.train
的类型信息。我认为这是不同的。 - link89f2
函数没有返回任何值,缺少了return
语句。 - Jurakinf2.__annotations__
可以回答你的问题,它返回{'kwargs': ~T}
。请参见文档。我不明白你说的“T无法捕获f1的kwargs”的意思。它是否可以捕获args和kwargs呢? - Jurakinself.train_model = self.model.train
- Jurakin