2017-03-14 6 views
1

내가 호출 할 수있는이 일순서에서 "튜플과리스트"와 같은 시퀀스 객체를 구별하는 pythonics의 방법이 다음과 같이

def print_stuff(items): 
    if isinstance(items, (str, bytes)): 
     items = (items,) 
    for item in items: 
     print (item) 

같은 기능을 가지고 "바이트 및 STR"와 같은 객체 :

In [37]: print_stuff(('a', 'b')) 
a 
b 

In [38]: print_stuff('a') 
a 

나는 MAGIC 다른 시퀀스 산부인과를 포함 할 수있는 모든 시퀀스 객체의 ABC이다 isinstance(item, (collections.abc.MAGIC))

을하는 것을 선호 isinstance (items, (str, bytes)) 일을 좋아하지 않는다 jects 같은

  • 목록
    • 튜플
    • 로 numpy.array
    • 일부 사용자 정의 벡터 클래스 등

    아니라 :

    • STR
    • 바이트
    • UTF-16에 대한 몇 가지 사용자 정의 STR 클래스 등

    내가 tuplestr이 같은 7 상식 :(

    In [49]: [v for k, v in vars(collections.abc).items() 
        ...:         if inspect.isclass(v) and issubclass(tuple, v) ] 
    Out[49]: 
    [collections.abc.Hashable, 
    collections.abc.Iterable, 
    collections.abc.Reversible, 
    collections.abc.Sized, 
    collections.abc.Container, 
    collections.abc.Collection, 
    collections.abc.Sequence] 
    
    In [50]: [v for k, v in vars(collections.abc).items() 
        ...:         if inspect.isclass(v) and issubclass(list, v) ] 
    Out[50]: 
    [collections.abc.Iterable, 
    collections.abc.Reversible, 
    collections.abc.Sized, 
    collections.abc.Container, 
    collections.abc.Collection, 
    collections.abc.Sequence, 
    collections.abc.MutableSequence] 
    
    In [51]: [v for k, v in vars(collections.abc).items() 
        ...:         if inspect.isclass(v) and issubclass(str, v) ] 
    Out[51]: 
    [collections.abc.Hashable, 
    collections.abc.Iterable, 
    collections.abc.Reversible, 
    collections.abc.Sized, 
    collections.abc.Container, 
    collections.abc.Collection, 
    collections.abc.Sequence] 
    
  • +0

    사용 예제가 분명하지 않습니다. * print_stuff ("ab") *에서 예상되는 결과는 무엇입니까? – guidot

    +0

    대문자로 질문을 시작하지 않은 이유는 무엇입니까? –

    +2

    [변수의 유형이 문자열인지 확인하는 방법]의 가능한 복제본 (http://stackoverflow.com/questions/4843173/how-to-check-if-type-of-a-variable-is-string) –

    답변

    1

    좋은 질문을 가지고이 불가능 두렵다.

    • 문자열을 튜플 또는 다른 변경 불가능한 시퀀스와 구별하는 ABC가 없습니다. 파이썬 3에는 단 하나의 문자열 유형이 있기 때문에 가장 Pythonic 한 솔루션은 실제로 isinstance(x, str)입니다.
    • bytesbytearray과 같은 바이트 시퀀스 유형은 collections.abc.ByteString ABC를 사용하여 구별 할 수 있습니다.

    물론, 당신은 또한 모두 strByteString, 또는 그것을하는 방법 등 capitalize 클래스를 확인하는 __subclasshook__을 줄이 포함되어 자신의 ABC를 정의 할 수 있습니다.

    +0

    __subclasshook__은 놀라운 idear입니다. 그것은 내 코드에 과잉 될 것이기 때문에해야한다. 정말 좋은 방법이 있었으면 좋겠다 : ( – jcr

    0

    마술types.StringTypes입니다. 그것은 추상적 인 기본 클래스가 아니지만 우리가 가진 최고입니다.

    https://docs.python.org/2/library/types.html#types.StringTypes

    (강조 내)에서 :

    시퀀스는 문자열 오브젝트 검사 쉽고 용이하게하기 위해 사용하고 StringTypeUnicodeType을 함유. 이것을 사용하면 Python 버전으로 빌드 된 경우에만 UnicodeType이 포함되어 있기 때문에 다른 곳에서 생성 된 두 문자열 유형의 시퀀스를 사용하는 것보다 더 휴대 가능합니다. 예 : isinstance(s, types.StringTypes).

    버전 2.2의 새로운 기능.

    +0

    types.StringTypes는 python 3.x에서 사용할 수 없다. – jcr