ネストされた抽象クラスの完全な型シグネチャをチェックするにはどうすればよいですか?この例Python:再帰的isinstanceチェック
In [4]: from typing import Sequence
In [5]: IntSeq = Sequence[int]
In [6]: isinstance([1], IntSeq)
Out[6]: True
In [7]: isinstance([1.0], IntSeq)
Out[7]: True
では、私はそれが唯一の引数がSequence
であることを確認しながら、最後isinstance
呼び出しが実際に、False
を返すようにしたいです。私は約再帰的なタイプをチェックすると思ったが、ネストされたタイプ(複数可)を格納一切パブリック属性IntSeq
ありません:
In [8]: dir(IntSeq)
Out[8]:
['__abstractmethods__',
'__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__extra__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__le__',
'__len__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__origin__',
'__parameters__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__slots__',
'__str__',
'__subclasshook__',
'__weakref__',
'_abc_cache',
'_abc_negative_cache',
'_abc_negative_cache_version',
'_abc_registry']
だから、ネストされた型を取得するのは簡単ではないようですが。私はドキュメントで関連情報を見つけることができません。
P.S. 複数のディスパッチ実装にはこれが必要です。 __parameters__
と__args__
:アレクサンダーHuszaghとブレンダーからのフィードバックに
更新
おかげで、私たちは今のPython 3.5での抽象クラスは、ネストされた型を格納二つの属性を持っている(かもしれない)を知っています。前者はLinux(Ubuntu)とDarwin(OS X)の両方の下にありますが、Linuxの場合は空です。後者はLinuxでのみ利用可能であり、OS Xの下では__parameters__
のようなタイプを格納します。この実装の詳細は混乱を招きます。
私はクローズ投票者に、「可能な回答が多すぎるか、この形式には長すぎると答えてもらえますか」という回答を希望します。回答セットを絞り込んだり、いくつかのパラグラフで答えることができます "。 –
isinstance(["hello"]、int_seq) 'も' True'です。簡単な型チェックの代わりに型定義を使用しようとするときに解決するよりも大きな問題を作成していないと確信していますか? –
@DmitryTorba私はPythonで真の多重ディスパッチを実装しようとしているので、完全な型シグネチャをチェックできるようにディスパッチャが必要です。 –