簡體   English   中英

Python類型提示-為dict子類指定鍵,值類型

[英]Python type hints - specify key, value type for dict subclass

說我有

class A(dict): pass

有什么辦法指定鍵的類型和A的值? 是否可以通過繼承類型的方式來完成-因此class B(A)可以繼承鍵的類型值,並且可以覆蓋值的類型?

理想情況下,這可以通過pep-0484中引入的類型提示來完成-但請注意,我使用的是python 2,因此我需要一個帶有類型注釋的解決方案。 但是,如果這不可能,涉及元類或任何其他黑客的解決方案將是可以接受的。

與類的所有類型交互都通過方法進行,因此請注釋這些方法。 A.__setitem__(self, key, value):用於設置鍵-值對,可以對其進行注釋以指示期望的類型。

任何有效的PEP 484注釋都可以在此處執行,如果需要Python 2兼容性,則包括類型注釋。

除非B覆蓋方法,否則這些注釋將繼承給B

詳細說明@MartijnPieters的答案 (我使用的是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]

而且,似乎沒有辦法將類型指定為可以在子類中輕易覆蓋的類變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM