개체가 목록인지 태플인지(문자열이 아님) 확인하는 방법
이 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
을 사용법
비(非)의, 비(非)입니다.str
type들어 일부 구조를 정의 은 @ type(@sysha type)의 원인이 될 수 .srepr
무한 재귀의 원인이 되는 함수입니다.이것이 다소 가능성이 낮다는 것은 인정하지만, 우리는 이 가능성을 무시할 수 없다. 특별한 str
srepr
우리가 합니다.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
각각 다음과 같다.에 의해, 「」는 됩니다.isinstance
hasattr
자기성찰 같은 거.
그 반대의 경우도 체크할 수 있습니다.
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
'sourcecode' 카테고리의 다른 글
Laravel 데이터베이스 스키마, Nullable Foreign (0) | 2022.10.07 |
---|---|
논리 연산자, | 또는 OR? (0) | 2022.10.07 |
JavaScript에서 여러 줄의 코드에 걸쳐 문자열을 분할하려면 어떻게 해야 합니까? (0) | 2022.10.07 |
MariaDB 10.1은 원칙 2.5와 호환됩니까? (0) | 2022.10.07 |
문자열 끝에서 콤마를 삭제하려면 어떻게 해야 하나요? (0) | 2022.10.07 |