파이썬 객체가 문자열 (일반 또는 유니 코드)인지 어떻게 확인할 수 있습니까?
파이썬 객체가 문자열 (일반 또는 유니 코드)인지 어떻게 확인할 수 있습니까?
답변:
객체 o
가 문자열 유형의 하위 클래스의 문자열 유형 인지 확인하려면
isinstance(o, basestring)
모두 때문에 str
과 unicode
의 서브 클래스입니다 basestring
.
유형 o
이 정확한지 확인하려면 다음을 수행하십시오 str
.
type(o) is str
다음 o
의 인스턴스 str
또는 서브 클래스인지 확인하려면 다음을 수행하십시오 str
.
isinstance(o, str)
유니 코드 문자열에 대한 위 또한 작업 바꿀 경우 str
에 unicode
.
그러나 명시 적 유형 검사를 수행 할 필요는 없습니다. "Duck 타이핑"은 필요에 맞을 수 있습니다. http://docs.python.org/glossary.html#term-duck-typing을 참조 하십시오 .
basestring
py2에서 확인해야합니다 .
Python 3.x에서는 유일한 문자열 유형 (Python 2.x의 시맨틱 포함)과 basestring
같이 더 이상 사용할 수 없습니다 .str
unicode
따라서 Python 3.x의 검사는 다음과 같습니다.
isinstance(obj_to_test, str)
이것은 다음 수정 공식의 2to3
변환 도구 : 변환 basestring
에 str
.
Python 버전 (2.x 대 3.x)에 관계없이 확인하려면 six
( PyPI ) 및 해당 string_types
속성을 사용하십시오.
import six
if isinstance(obj, six.string_types):
print('obj is a string!')
내 six
(아주 가벼운 단일 파일 모듈), 단순히하고있어 이 :
import sys
PY3 = sys.version_info[0] == 3
if PY3:
string_types = str
else:
string_types = basestring
basestring
다음로 넘어갑니다 str
. 예 :def is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
나는 이것보다 더 많은 것을 발견했다 pythonic
.
if type(aObject) is str:
#do your stuff here
pass
유형 오브젝트는 싱글이기 때문에, 있다 는 STR 유형에 개체를 비교 할 수 있습니다
isinstance(obj_to_test, str)
다른 비 str 사례와 동일한 절차를 사용하는 이점이 있습니다.
하나는 명시 적 유형 검사 (거기에서 멀리하고자하는 경우 입니다 검사가되는 문자열 프로토콜의 그것에서 멀리 좋은 이유), 아마 가장 안전한 부분 :
str(maybe_string) == maybe_string
그것은, 그것은리스트의-문자열 문자열을 호출하지 않습니다하지으로 반복 반복 가능 또는 반복자를 통해 것이며, 그것은 정확하게 감지 stringlike 문자열로합니다.
물론 단점이 있습니다. 예를 들어 str(maybe_string)
계산이 무거울 수 있습니다. 자주 대답은 에 달려 있습니다.
편집 : @Tcll 이 주석에서 지적했듯이 질문은 실제로 유니 코드 문자열과 바이트 문자열을 모두 감지하는 방법을 묻습니다. Python 2에서는 ASCII가 아닌 문자를 포함하는 유니 코드 문자열에 대한 예외 로이 답변이 실패하고 Python 3에서는 False
모든 바이트 문자열에 대해 반환 됩니다.
b = b'test'; r = str(b) == b
여기서 b
동일한 데이터를 보유 str(b)
하지만 (바이트 객체) 문자열로 유효성을 검사하지 않습니다.
변수가 어떤 것인지 확인하려면 다음과 같이하십시오.
s='Hello World'
if isinstance(s,str):
#do something here,
isistance의 출력은 부울 True 또는 False 값을 제공하므로 적절하게 조정할 수 있습니다. 다음을 사용하여 값의 예상 약어를 확인할 수 있습니다. type (s) isstance 함수에서 사용할 수 있도록 'str'유형을 반환합니다.
나는 다른 사람들이 언급 한 것처럼 오리 타이핑 스타일로 이것을 다룰 수 있습니다. 문자열이 실제로 문자열인지 어떻게 알 수 있습니까? 글쎄, 분명히 문자열 로 변환 하여!
def myfunc(word):
word = unicode(word)
...
인수가 이미 문자열 또는 유니 코드 유형 인 경우 real_word는 수정되지 않은 값을 보유합니다. 전달 된 객체가 __unicode__
메서드를 구현하는 경우 해당 유니 코드 표현을 얻는 데 사용됩니다. 전달 된 객체를 문자열로 사용할 수없는 경우 unicode
내장에서 예외가 발생합니다.
오늘 저녁에 나는 유형 에 대해 점검해야 한다고 생각 하는 상황에 부딪 str
쳤지 만 그렇지 않았다.
문제 해결에 대한 나의 접근 방식은 아마도 많은 상황에서 효과가있을 것이므로이 질문을 읽는 다른 사람들이 관심을 가질 수 있도록 아래에 제공합니다 (Python 3 전용).
# NOTE: fields is an object that COULD be any number of things, including:
# - a single string-like object
# - a string-like object that needs to be converted to a sequence of
# string-like objects at some separator, sep
# - a sequence of string-like objects
def getfields(*fields, sep=' ', validator=lambda f: True):
'''Take a field sequence definition and yield from a validated
field sequence. Accepts a string, a string with separators,
or a sequence of strings'''
if fields:
try:
# single unpack in the case of a single argument
fieldseq, = fields
try:
# convert to string sequence if string
fieldseq = fieldseq.split(sep)
except AttributeError:
# not a string; assume other iterable
pass
except ValueError:
# not a single argument and not a string
fieldseq = fields
invalid_fields = [field for field in fieldseq if not validator(field)]
if invalid_fields:
raise ValueError('One or more field names is invalid:\n'
'{!r}'.format(invalid_fields))
else:
raise ValueError('No fields were provided')
try:
yield from fieldseq
except TypeError as e:
raise ValueError('Single field argument must be a string'
'or an interable') from e
일부 테스트 :
from . import getfields
def test_getfields_novalidation():
result = ['a', 'b']
assert list(getfields('a b')) == result
assert list(getfields('a,b', sep=',')) == result
assert list(getfields('a', 'b')) == result
assert list(getfields(['a', 'b'])) == result
간단합니다. 다음 코드를 사용하십시오 (우리는 객체가 obj라고 가정합니다).
if type(obj) == str:
print('It is a string')
else:
print('It is not a string.')
빈 문자열로 연결하여 테스트 할 수 있습니다.
def is_string(s):
try:
s += ''
except:
return False
return True
편집 :
이것이 목록과 함께 실패한다고 지적한 후 내 대답을 수정하십시오.
def is_string(s):
return isinstance(s, basestring)
Python 2.x 및 3.x와 함께 작동하는 보너스를 가진 문자열과 같은 멋진 오리 타이핑 접근 방식 :
def is_string(obj):
try:
obj + ''
return True
except TypeError:
return False
wisefish 는 isinstance
접근 방식으로 전환하기 전에 오리 유형과 밀접한 관계 가 있었지만+=
목록과는 다른 의미를 갖습니다 +
.
isalpha
있지만 어떤 방법을 사용하는 것이 안전한지 누가 알 수 있습니까?
try
더 빠를 수 있습니다. 99 %의 시간을 기대한다면 그렇지 않을 수도 있습니다. 성능 차이는 최소화되므로 코드를 프로파일 링하고 실제로 느리게 식별하지 않는 한 관용적 인 것이 좋습니다.