2016-08-22 3 views
4

중첩 추상 클래스의 전체 형식 서명을 어떻게 확인할 수 있습니까? 이 예파이썬 : 재귀 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. 다중 발송 구현에이 기능이 필요합니다. __parameters____args__ : 알렉산더 Huszagh와 블렌더의 피드백에

업데이트

덕분에 우리는 이제 파이썬 3.5에서 추상 클래스가 중첩 된 형식을 저장하는 두 가지 속성을 가지고 (수)를 것을 알고있다. 전자는 Linux (Ubuntu)와 Darwin (OS X) 모두에 있지만 Linux의 경우에는 비어 있습니다. 나중에는 Linux에서만 사용할 수 있으며 OS X에서는 __parameters__과 같은 유형을 저장합니다.이 구현 세부 정보는 혼동을 불러옵니다.

+3

가까운 투표자에게 "가능한 많은 답변이 있거나 좋은 답변이이 형식에 비해 너무 길어질 수 있습니다. 답변 세트를 좁히거나 문제를 격리하기위한 세부 정보를 추가하십시오. 몇 단락으로 대답 할 수 있습니다. " –

+0

isinstance ([ "hello"], int_seq)'또한'True'입니다. 간단한 유형 확인 대신 입력을 사용하려고 할 때 해결하는 것보다 더 큰 문제를 만들지 않습니까? –

+0

@DmitryTorba 파이썬에서 실제 다중 디스패치를 ​​구현하려고하므로 전체 형식 서명을 검사 할 수 있도록 디스패처가 필요합니다. –

답변

2

아직 잠정적 인 모듈을 사용하여 무언가를 구현하려고합니다. 이렇게하면 인터페이스를 변경해야합니다.

블렌더는 __parameters__ 인수에 유형에 대한 매개 변수가 있음을 알았습니다. 그때까지는 사실이었습니다. 나는 3.5.1라고 믿습니다. , 3.6 이후

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

는 의지를 입력됩니다 : 파이썬의 가장 최신 버전의 내 자식 클론에서 (3.6.0a4+) __parameters__ 다시 __args__이 인수를 보유하고 __origin____bases__ 속성의 첫 번째 항목 인 빈 튜플을 보유하고 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'는 인수가 공변 (covariant)하다는 것을 의미합니다. 동일한 PEP (공분산 및 반동) 섹션 (https://www.python.org/dev/peps/pep-0484/#covariance- 및 contravariance)). –