sourcecode

개체가 목록인지 태플인지(문자열이 아님) 확인하는 방법

copyscript 2022. 10. 7. 22:20
반응형

개체가 목록인지 태플인지(문자열이 아님) 확인하는 방법

이 CVP인지 확인하기 보통 이렇게 합니다.list/tuple a는 안 요. - 네.str 함수가 번 str가 """ "" "" " " " " " " " " " " " " 가 됩니다.for x in lst라고 lst는 '아예'입니다.list ★★★★★★★★★★★★★★★★★」tuple.

assert isinstance(lst, (list, tuple))

제 질문은, 이것을 실현하는 더 좋은 방법이 있을까요?

python 2에서만(python 3이 아님):

assert not isinstance(lst, basestring)

목록과 수 그.그렇지 않으면 리스트와 같은 역할을 하는 많은 것들을 놓치게 됩니다.그러나 그 서브클래스는 아닙니다.list ★★★★★★★★★★★★★★★★★」tuple.

Python에서는 "duck typing"을 사용하려고 합니다.따라서 목록과 같은 역할을 하는 모든 것은 목록으로 처리될 수 있습니다.따라서 목록의 종류를 확인하지 말고 목록처럼 기능하는지 확인합니다.

하지만 현악기도 목록처럼 작용하고 우리가 원하는 것이 아닌 경우가 많습니다.심지어 그것이 문제가 될 때도 있어요!따라서 문자열을 명시적으로 확인한 후 오리타입을 사용합니다.

을 사용하다은 의의 of it의 of of of of of of of of it it 。repr()<, '>, '>, '''로 표현하다.

def srepr(arg):
    if isinstance(arg, basestring): # Python 3: isinstance(arg, str)
        return repr(arg)
    try:
        return '<' + ", ".join(srepr(x) for x in arg) + '>'
    except TypeError: # catch when for loop fails
        return repr(arg) # not a sequence so just return repr

전체적으로 깔끔하고 우아합니다. 그게 isinstance()기서서 뭘???츠미야하지만 그것은 필수적이다.

이 함수는 목록과 같은 기능을 하는 모든 항목에서 반복 호출합니다.문자열을 특별히 취급하지 않으면 목록처럼 취급되어 한 번에 한 글자씩 분할됩니다.그러나 재귀 호출은 각 문자를 목록으로 처리하려고 시도합니다. 그러면 작동하게 됩니다.한 글자의 문자열도 리스트로!함수는 스택오버플로우가 발생할 때까지 계속 반복적으로 호출합니다.

이와 같은 함수는 수행할 작업을 분류하는 각 재귀 호출에 따라 달라지는데, 이는 문자열을 1문자열 수준 이하로 분류할 수 없고 1문자열도 목록과 같은 역할을 하기 때문입니다.

★★★★★try/except우리의 의도를 표현하는 가장 깨끗한 방법입니다. 이 가 다소 중요한 라면 이 를 일종의 이 코드와 교환하여 이 코드가 시간적으로 중요한 코드인지 를 확인하는 것이 .arg을 사용하다유형을 테스트하기보다는 행동을 테스트해야 할 것 같습니다.「」가 있는 .strip()method는그렇지 않으면 하거나 반복할 수 있는 가 됩니다.그렇지 않으면 인덱스가 가능하거나 반복할 수 있는 경우에는 시퀀스가 됩니다.

def is_sequence(arg):
    return (not hasattr(arg, "strip") and
            hasattr(arg, "__getitem__") or
            hasattr(arg, "__iter__"))

def srepr(arg):
    if is_sequence(arg):
        return '<' + ", ".join(srepr(x) for x in arg) + '>'
    return repr(arg)

편집: 저는 원래 위 내용을 수표와 함께 썼습니다.__getslice__() 나는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★collections은 " " " " 입니다.__getitem__(); ; ; ; ; ; ; ; ; ; ; 。그게 오브젝트의 인덱스를 작성하는 방법입니다. 더 인 것 요.__getslice__()이치노

H = "Hello"

if type(H) is list or type(H) is tuple:
    ## Do Something.
else
    ## Do Something.

Python 3:

import collections.abc

if isinstance(obj, collections.abc.Sequence) and not isinstance(obj, str):
    print("`obj` is a sequence (list, tuple, etc) but not a string or a dictionary.")

3됨: " Class 이름공간이 "Collections Abstract Base Class"에서 됨: " Abstract Base Class"로 변경됨abc로로 합니다.collections.abc하위 호환성을 위해 버전 3.8이 작동을 중지할 때까지 이 모듈에서도 계속 볼 수 있습니다.

Python 2:

import collections

if isinstance(obj, collections.Sequence) and not isinstance(obj, basestring):
    print "`obj` is a sequence (list, tuple, etc) but not a string or unicode or dictionary."

PHP 플레이버가 있는 Python:

def is_array(var):
    return isinstance(var, (list, tuple))

일반적으로 오브젝트상에서 반복하는 함수는 문자열이나 튜플, 리스트에서 동작하는 것이 버그보다 특징입니다. 사용하셔도 됩니다.isinstance아니면 논쟁을 확인하기 위해 오리타자를 쳐야 하는데, 왜 그래야 하죠?

그것은 수사적인 질문처럼 들리지만 그렇지 않다."왜 인수의 유형을 확인해야 하는가?"에 대한 대답은 아마도 인식된 문제가 아니라 실제 문제에 대한 해결책을 제안할 것입니다.문자열이 함수에 전달될 때 버그가 되는 이유는 무엇입니까?또한 문자열이 이 함수에 전달되었을 때 버그가 발생한 경우, 다른 목록/태플 반복 가능한 문자열이 전달되었을 경우에도 버그가 발생합니까?왜 그런가요? 혹은 왜 그렇지 않은가요?

이 질문에 대한 가장 일반적인 대답은 아마도 개발자들이f("abc")는 마치 쓴 할 것으로 기대하고 있습니다.f(["abc"]) 내의 이 더 수 문자열의 여러 문자를 반복하는 사용 사례를 지원하는 것보다 개발자를 자신으로부터 보호하는 것이 더 합리적인 상황이 있을 수 있습니다.하지만 나는 먼저 그것에 대해 길고 열심히 생각할 것이다.

가독성 및 베스트 프랙티스를 위해 다음을 시도해 보십시오.

Python2 - isinstance()

import types
if isinstance(lst, types.ListType) or isinstance(lst, types.TupleType):
    # Do something

Python3 - isinstance()

import typing
if isinstance(lst, typing.List) or isinstance(lst, typing.Tuple):
    # Do something

도움이 됐으면 좋겠다.

str이 없다.__iter__

>>> hasattr('', '__iter__')
False 

확인하실 수 있습니다.

assert hasattr(x, '__iter__')

은 또한 을 줄 이다.AssertionError른른른른른 른른 른른른른

편집: Tim이 코멘트에서 언급했듯이 이것은 3.x가 아닌 python 2.x에서만 작동합니다.

OP에 직접 답변하는 것은 아니지만, 관련된 아이디어를 공유하고 싶습니다.

저는 위의 @steveha 답변에 매우 관심이 있었습니다.그것은 덕타이핑이 깨지는 예를 든 것 같습니다.그러나 다시 생각해보면, 그의 예는 오리타자는 따르기 어렵다는 것을 시사하지만, 그것이 그것을 시사하는 것은 아니다.str을 사용법

비(非)의, 비(非)입니다.strtype들어 일부 구조를 정의 은 @ type(@sysha type)의 원인이 될 수 .srepr무한 재귀의 원인이 되는 함수입니다.이것이 다소 가능성이 낮다는 것은 인정하지만, 우리는 이 가능성을 무시할 수 없다. 특별한 strsrepr 우리가 합니다.srepr무한 재귀가 발생할 때 수행할 작업입니다.

가지 은 단순히 될 수 있습니다.srepr 의 순간list(arg) == [arg] 하면 실제로str를 지정하지 , 「」를 참조해 주세요.isinstance.

수 있습니다.여기서 재귀구조는 수 있습니다.list(arg) == [arg]츠미야따라서 위의 체크는 유용하지만 충분하지 않습니다.재귀 깊이에 대한 엄격한 제한 같은 것이 필요합니다.

은 임의의 유형을 한다는 입니다.str 접하게되는 유형을 훨씬 .그래서 만약 당신이 이 모든 것들을 제외시킬 필요가 있다고 느낀다면str한 몇 .

텐서플로우에서 is_sequence라는 함수를 찾을 수 있습니다.

def is_sequence(seq):
  """Returns a true if its input is a collections.Sequence (except strings).
  Args:
    seq: an input sequence.
  Returns:
    True if the sequence is a not a string and is a collections.Sequence.
  """
  return (isinstance(seq, collections.Sequence)
and not isinstance(seq, six.string_types))

그리고 당신의 요구를 충족시키는 것을 확인했습니다.

난 내 고환에서 이걸 해.

def assertIsIterable(self, item):
    #add types here you don't want to mistake as iterables
    if isinstance(item, basestring): 
        raise AssertionError("type %s is not iterable" % type(item))

    #Fake an iteration.
    try:
        for x in item:
            break;
    except TypeError:
        raise AssertionError("type %s is not iterable" % type(item))

발전기에 대한 테스트를 거치지 않은 상태에서 발전기를 통과하면 다음 '수율'을 유지하게 되며, 이는 하류에서 문제를 일으킬 수 있습니다.하지만 다시 말하지만, 이건 '단순히'

"duck typing" 방식으로 하면 어떨까요?

try:
    lst = lst + []
except TypeError:
    #it's not a list

또는

try:
    lst = lst + ()
except TypeError:
    #it's not a tuple

각각 다음과 같다.에 의해, 「」는 됩니다.isinstancehasattr자기성찰 같은 거.

그 반대의 경우도 체크할 수 있습니다.

try:
    lst = lst + ''
except TypeError:
    #it's not (base)string

모든 변형은 실제로 변수의 내용을 변경하는 것이 아니라 재할당을 의미합니다.어떤 상황에서는 이것이 바람직하지 않은지 잘 모르겠습니다.

'로, '적소'는 '적소'로 되어 있다.+= ★★★★★★★★★★★★★★★★ 없음TypeError 라도 제기될 것이다)가lst리스트입니다(태플이 아닙니다).그래서 이런 식으로 과제를 하는 거예요.아마도 누군가가 왜 그런지 밝혀줄 수 있을 것이다.

문자열과 같은 개체를 다른 시퀀스 같은 개체와 구별하는 데 도움이 되는 다른 버전의 덕 타이핑입니다.

그 에, 에서할 수 .str★★★★★★★★★★★★★★★★★★:

# If a string was passed, convert it to a single-element sequence
if var == str(var):
    my_list = [var]

# All other iterables
else: 
    my_list = list(var)

은 모든 할 수 합니다.str그리고 모든 종류의 반복할 수 있는 물건에 대해서요.

★★★★★★★★★★★★★★★...를 사용합니다.any ★★★★★★★★★★★★★★★★★」isinstance

>>> console_routers = 'x'
>>> any([isinstance(console_routers, list), isinstance(console_routers, tuple)])
False
>>>
>>> console_routers = ('x',)
>>> any([isinstance(console_routers, list), isinstance(console_routers, tuple)])
True
>>> console_routers = list('x',)
>>> any([isinstance(console_routers, list), isinstance(console_routers, tuple)])
True

Python 3의 특징은 다음과 같습니다.

from typing import List

def isit(value):
    return isinstance(value, List)

isit([1, 2, 3])  # True
isit("test")  # False
isit({"Hello": "Mars"})  # False
isit((1, 2))  # False

따라서 목록과 튜플을 모두 확인하려면 다음과 같이 하십시오.

from typing import List, Tuple

def isit(value):
    return isinstance(value, List) or isinstance(value, Tuple)
assert (type(lst) == list) | (type(lst) == tuple), "Not a valid lst type, cannot be string"

그냥 이렇게 해

if type(lst) in (list, tuple):
    # Do stuff

python > 3.6

import collections
isinstance(set(),collections.abc.Container)
True
isinstance([],collections.abc.Container)
True
isinstance({},collections.abc.Container)
True
isinstance((),collections.abc.Container)
True
isinstance(str,collections.abc.Container)
False

(꼭 해야 한다면) 이렇게 하는 경향이 있습니다.

for i in some_var:
   if type(i) == type(list()):
       #do something with a list
   elif type(i) == type(tuple()):
       #do something with a tuple
   elif type(i) == type(str()):
       #here's your string

언급URL : https://stackoverflow.com/questions/1835018/how-to-check-if-an-object-is-a-list-or-tuple-but-not-string

반응형