Python-3.5类型化。泛型子类从不调用`\u init__`

Python-3.5类型化。泛型子类从不调用`\u init__`,python,generics,python-3.5,Python,Generics,Python 3.5,在下面的代码中,我有一个子类Generic。如果我在直接指定类型后尝试实例化它(如Bar的情况),则似乎永远不会调用\uuuuu init\uuuu。有关PDB中的步骤至,请参见下文 from typing import Generic, TypeVar T = TypeVar('T') class Foo(Generic[T]): def __init__(self, value: T): self.value = value Bar = Foo[str] foo

在下面的代码中,我有一个子类
Generic
。如果我在直接指定类型后尝试实例化它(如
Bar
的情况),则似乎永远不会调用
\uuuuu init\uuuu
。有关PDB中的步骤至,请参见下文

from typing import Generic, TypeVar

T = TypeVar('T')
class Foo(Generic[T]):
    def __init__(self, value: T):
        self.value = value

Bar = Foo[str]

foo = Foo('foo')
bar = Bar('bar')

print(type(foo), end=' ')
print(foo.value)

print(type(bar), end=' ')
print(bar.value) # AttributeError
根据文件:

泛型基类使用一个元类来定义getitem() LoggedVar[t]作为一种类型有效:

这是一个错误,还是我不明白

编辑

在PDB中单步执行Foo(“Foo”)案例,注意结尾调用的
\uuuu init\uuu

> /home/kjw53/test.py(1)<module>()
-> from typing import Generic, TypeVar
(Pdb) break /usr/lib/python3.5/typing.py:1078
Breakpoint 1 at /usr/lib/python3.5/typing.py:1078
(Pdb) c
> /usr/lib/python3.5/typing.py(1078)__new__()
-> return next_in_mro.__new__(_gorg(cls))
(Pdb) p cls
__main__.Foo[~T]
(Pdb) p next_in_mro
<class 'object'>
(Pdb) p _gorg(cls)
__main__.Foo[~T]
(Pdb) s
--Call--
> /usr/lib/python3.5/typing.py(858)_gorg()
-> def _gorg(a):
(Pdb) r
--Return--
> /usr/lib/python3.5/typing.py(863)_gorg()->__main__.Foo[~T]
-> return a
(Pdb) n
--Return--
> /usr/lib/python3.5/typing.py(1078)__new__()-><__main__.Foo...x7f57094b1a20>
-> return next_in_mro.__new__(_gorg(cls))
(Pdb) s
--Call--
> /home/kjw53/test.py(5)__init__()
-> def __init__(self, value: T):

只要在Windows上用Python3.5.2 64位运行它,它就可以正常工作! 如果它是一个bug,现在已经修复了

输出:

  • main.Foo-Foo
  • main.Foo-bar

您实际上想做什么?我有一个类,其中一个方法检查类的
\uuuu init\uuuu
方法的注释并实例化这些注释。因此,如果注释是
Foo[str]
,则会中断。看着PDB,我不知道为什么会这样。在不涉及太多细节的情况下,这有用吗?在有效的测试用例中,您是否可以使用
类条(Foo[“str”]):
?进行子类化。但这意味着我用这种方式为泛型的每一个实例创建一个显式的子类,这似乎违背了使用带有注释的泛型的意义。我会提交一份错误报告,如果有一些逻辑说明这种方法不起作用,那么可能会出现一些错误或警告,如果显式调用bar的init方法,它工作得很好,并且foo和bar都是
\uuuu main\uuuu.foo
对象,因此没有非常明显的原因说明为什么会调用一个init方法而不调用其他方法。它失败的原因是因为
\u gorg
中的逻辑,如果您只是在
gorg中返回了
a
,或者在
mro中返回了
next.\uu新的(cls)
一切都会正常工作,因此问题的核心就在那里
(Pdb) c
> /usr/lib/python3.5/typing.py(1078)__new__()
-> return next_in_mro.__new__(_gorg(cls))
(Pdb) p cls
__main__.Foo[str]
(Pdb) p next_in_mro
<class 'object'>
(Pdb) p _gorg(cls)
__main__.Foo[~T]
(Pdb) s
--Call--
> /usr/lib/python3.5/typing.py(858)_gorg()
-> def _gorg(a):
(Pdb) r
--Return--
> /usr/lib/python3.5/typing.py(863)_gorg()->__main__.Foo[~T]
-> return a
(Pdb) n
--Return--
> /usr/lib/python3.5/typing.py(1078)__new__()-><__main__.Foo...x7f57094b1a58>
-> return next_in_mro.__new__(_gorg(cls))
(Pdb) s
> /home/kjw53/test.py(13)<module>()
-> print(type(foo), end=' ')