说我有
class A(dict): pass
有没有办法指定键的类型和A的值?是否可以以继承类型的方式完成 - 所以class B(A)
会继承类型值,比如key,并且能够覆盖值的类型吗?
理想情况下,这可以通过pep-0484中引入的类型提示来完成 - 但请注意我在python 2上,所以我需要一个带有类型注释的解决方案。但是,如果不可能,则可以接受涉及元类或任何其他黑客的解决方案。
答案 0 :(得分:2)
与您的类的所有类型交互都经过方法,因此请注释这些方法。调用A.__setitem__(self, key, value):
来设置键值对,可以注释以指示预期的类型。
这里有任何有效的PEP 484注释,包括类型注释,如果你需要Python 2兼容性。
除非B覆盖方法,否则这些注释将继承到B
。
答案 1 :(得分:0)
阐述@MartijnPieters answer(我正在使用Pycharm 5.0.4,因此下面的行为可能是由于标准或IDE错误/功能)
_key_type_global = unicode
class A(dict):
_key_type = unicode
def __setitem__(self, key, value):
"""A._key_type is not recognised, _key_type_global is
:type key: _key_type_global
:type value: int
"""
super(A, self).__setitem__(key, value)
class B(A): pass
a = A()
a['str'] = 'uy' # expected type unicode got str instead
a[u'str'] = 'uy' # no warn (?)
a[u'str'] = 1 # no warn
val = a[u'str'] # Pycharm does not give any type info on value so I have to
# define __getitem__ too
# type info is inherited
b = B()
b['str'] = 'uy' # expected type unicode got str instead
b[u'str'] = 'uy' # no warn (?)
b[u'str'] = 1 # no warn
因此需要覆盖所有方法(键值类型信息是各个方法的本地方法)。 IOW,与参数或属性等的情况不同,人们可以这样做:
class A(object):
def __init__(self, dct):
self.dct = dct # type : dict[unicode, int]
这是一个NOOP:
class A(dict): # type dict[unicode, int]
此外,似乎无法将类型指定为可在子类中轻易覆盖的类变量。