2016-08-22 17 views
4

ネストされた抽象クラスの完全な型シグネチャをチェックするにはどうすればよいですか?この例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__のようなタイプを格納します。この実装の詳細は混乱を招きます。

+3

私はクローズ投票者に、「可能な回答が多すぎるか、この形式には長すぎると答えてもらえますか」という回答を希望します。回答セットを絞り込んだり、いくつかのパラグラフで答えることができます "。 –

+0

isinstance(["hello"]、int_seq) 'も' True'です。簡単な型チェックの代わりに型定義を使用しようとするときに解決するよりも大きな問題を作成していないと確信していますか? –

+0

@DmitryTorba私はPythonで真の多重ディスパッチを実装しようとしているので、完全な型シグネチャをチェックできるようにディスパッチャが必要です。 –

答えて

2

まだ暫定的なモジュールを使用して何かを実装しようとしています。これを行うと、変化するインターフェースに遭遇します。

blenderは、__parameters__引数がその型へのパラメータを保持していることに気付きました。私が信じるまで、これは真実でした。3.5.1。パイソン(3.6.0a4+__parameters__の最新バージョンの私のgitのクローンは再び空のタプルを保持しているでは、__args__は、引数を保持し、__origin__はその__bases__属性の最初のエントリです:

>>> intSeq = typing.Sequence[int] 
>>> intSeq.__args__ 
(<class 'int'>,) 
>>> intSeq.__parameters__ 
() 
>>> intSeq.__origin__ 
typing.Sequence<+T_co> 

意志を入力するとき3.6があるので、私がPEP 411から理解しているところから、暫定的なままにして、安定した状態にしてください。これはあなたの機能を実装するために取り組むべきバージョンです。

+0

説明をありがとうございます。私はPEP 411で 'typing'への言及を見つけませんでした。' + T_co'が '__origin__'属性で何を意味するのか知っていますか? –

+0

しかし、PEP 411は、モジュールを導入した[PEP 0484](https://www.python.org/dev/peps/pep-0484/#abstract)の要約にある暫定的なモジュールについては言及しません:-) '+ T_co'は、引数が共変であることを意味します。同じPEPでそれについてもっと読むことができます(セクション[共分散と反動](https://www.python.org/dev/peps/pep-0484/#covariance-および反差異))。 –