假设我们有一个功能

def get_attr_wrapper(obj: object, attr: str) -> ???:
    return getattr(obj, attr)

如何根据给定的参数推断返回类型get_attr_wrapper

也许以某种方式使用仿制药?

例如,如果我通过

from dataclasses import dataclass

@dataclass
class Foo:
    bar: str

foo = Foo(bar="baz")

rv = get_attr_wrapper(foo, "bar")

在我们想要的场景中,Python的类型判断器将rv推断为类型string.

推荐答案

因此,没有真正的方法可以从__getattr__呼叫中找到类型.也就是说,可以让类型判断器相信您的对象 struct 略有不同,然后根据给定字符串推断类型.

TypedDict个对象允许通过字符串而不是属性获取,并且仍然推断类型.我们可以使用cast来"假装"Foo实际上是TypedDict,并以与get_attr_wrapper相同的方式实现__getitem__:

from dataclasses import dataclass
from typing import TypedDict, cast

class FooDict(TypedDict):
    bar: str

@dataclass
class Foo:
    bar: str

    def __getitem__(self, attr:str):
        # Behavior of get_attr_wrapper
        return getattr(self, attr)

foo = cast(FooDict, Foo(bar="baz"))

rv = foo["bar"]
print(rv)

希望这有用!

Python相关问答推荐

如何用symy更新分段函数

有条件地采样我的大型DF的最有效方法

jit JAX函数中的迭代器

根据给定日期的状态过滤查询集

如何让 turtle 通过点击和拖动来绘制?

韦尔福德方差与Numpy方差不同

为什么tkinter框架没有被隐藏?

. str.替换pandas.series的方法未按预期工作

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

优化pytorch函数以消除for循环

有没有一种ONE—LINER的方法给一个框架的每一行一个由整数和字符串组成的唯一id?

计算分布的标准差

在pandas/python中计数嵌套类别

Python pint将1/华氏度转换为1/摄氏度°°

30个非DATETIME天内的累计金额

如何在Python中将超链接添加到PDF中每个页面的顶部?

仅使用预先计算的排序获取排序元素

如何在Django模板中显示串行化器错误

如何提高Pandas DataFrame中随机列 Select 和分配的效率?

将字节序列解码为Unicode字符串