답변:
빈 문자열은 "거짓"입니다. 이는 부울 컨텍스트에서 거짓으로 간주되므로 다음과 같이하면됩니다.
if not myString:
변수가 문자열임을 알고있는 경우이 방법이 선호됩니다. 변수가 다른 유형일 수도있는 경우을 사용해야합니다 myString == ""
. 부울 컨텍스트에서 잘못된 다른 값 에 대해서는 진실 값 테스트 문서를 참조하십시오 .
if not myString:
경우 블록을 myString
했다 None
, 0
, False
등 그래서 당신은 확실히 타입이 무엇을하지 않은 경우 myString
, 당신은 사용해야 if myString == "":
은 반대로 빈 문자열이 있는지 확인하려면 다른 허위 가치.
if myString == ...
표현 대신 if myString in (None, '')
@Bartek을 사용 하거나 그에 따라 사용할 수 있습니다 .if myString in (None, '') or not myString.strip()
에서 PEP 8 의에서 "권장 사항 프로그래밍"섹션 :
시퀀스 (문자열, 목록, 튜플)의 경우 빈 시퀀스가 거짓이라는 사실을 사용하십시오.
따라서 다음을 사용해야합니다.
if not some_string:
또는:
if some_string:
그냥 순서가되어, 명확하게 평가 로 False
또는 True
그들이 비어 있거나없는 경우 부울 맥락에서. 그들은는 동일하지 에 False
나 True
.
x == False
있습니다. 그러나 IMHO는 대상 청중에게 설명을 환영합니다.
벗기기 전에 테스트를하지 않을 것입니다. 또한 빈 문자열이 False (또는 Falsy)라는 사실을 사용합니다. 이 방법은 Apache의 StringUtils.isBlank 또는 Guava의 Strings.isNullOrEmpty 와 유사합니다.
이것은 문자열이 None 또는 Empty 또는 Blank인지 테스트하는 데 사용하는 것입니다.
def isBlank (myString):
if myString and myString.strip():
#myString is not None AND myString is not empty or blank
return False
#myString is None OR myString is empty or blank
return True
그리고 문자열이 None NOR Empty NOR Blank가 아닌 경우 테스트와 정확히 반대입니다.
def isNotBlank (myString):
if myString and myString.strip():
#myString is not None AND myString is not empty or blank
return True
#myString is None OR myString is empty or blank
return False
위 코드의 간결한 형태 :
def isBlank (myString):
return not (myString and myString.strip())
def isNotBlank (myString):
return bool(myString and myString.strip())
if mystring and not mystring.strip()
?
string and not string.isspace()
가요?
def isBlank(s): return not (s and s.strip())
그리고 def isNotBlank(s): return s and s.strip()
.
나는 한 번 Bartek의 답변과 비슷한 것을 썼고 자바 스크립트에서 영감을 얻었습니다.
def is_not_blank(s):
return bool(s and s.strip())
테스트:
print is_not_blank("") # False
print is_not_blank(" ") # False
print is_not_blank("ok") # True
print is_not_blank(None) # False
return bool(s.strip())
AttributeError: 'NoneType' object has no attribute 'strip'
이 작업을 수행하는 유일한 확실한 방법은 다음과 같습니다.
if "".__eq__(myString):
다른 모든 솔루션에는 확인이 실패 할 수있는 가능한 문제 및 엣지 사례가 있습니다.
len(myString)==0
메소드 myString
를 상속 str
하고 __len__()
메소드를 대체 하는 클래스의 오브젝트 인 경우 실패 할 수 있습니다 .
마찬가지로 myString == ""
및 myString.__eq__("")
경우 실패 할 수 있습니다 myString
무시 __eq__()
하고 __ne__()
.
어떤 이유로 든 재정의 "" == myString
하면 바보가됩니다 .myString
__eq__()
myString is ""
그리고 "" is myString
동등합니다. myString
실제로 문자열이 아니라 문자열의 하위 클래스 인 경우 모두 실패 합니다 (둘 다 반환 False
). 또한 ID 확인이기 때문에 파이썬이 작동하는 유일한 이유는 파이썬이 문자열 풀링 (문자열 인턴이라고도 함)을 사용하여 문자열의 동일한 인스턴스를 사용하는 것입니다 (여기 : '= = '또는'is '는 때때로 다른 결과를 생성합니까? ). 그리고 ""
CPython의 시작부터 인턴
신원 확인의 큰 문제는 문자열 인턴이 어떤 문자열이 인턴되어 있는지 표준화되어 있지 않다는 것입니다. 즉, 이론적으로 ""
는 필요하지 않으며 구현에 따라 다릅니다.
실제로 속일 수없는 유일한 방법은 처음에 언급 한 방법입니다 "".__eq__(myString)
. 이것은 명시 적으로 __eq__()
빈 문자열 의 메소드를 호출하기 때문에 myString의 메소드를 대체하여 속일 수 없으며의 하위 클래스와 제대로 작동합니다 str
.
또한 객체가 __bool__()
메서드를 재정의하면 문자열의 거짓에 의존하는 것이 작동하지 않을 수 있습니다 .
이것은 이론적 인 작업 일뿐 만 아니라 실제로 프레임 워크 및 라이브러리 서브 클래스 화 str
를 사용하고 사용하여 myString is ""
잘못된 출력을 반환 할 수 있기 때문에 실제 사용과 관련이 있을 수 있습니다.
또한 is
문자열 풀링이 꽤 이상한 규칙을 따르기 때문에 때로는 올바르게 작동하지만 다른 시간에는 그렇지 않기 때문에 일반적으로 문자열을 사용 하는 것은 꽤 나쁜 함정입니다.
즉, 대부분의 경우 언급 된 모든 솔루션이 올바르게 작동합니다. 이 게시물은 대부분 학업입니다.
빈 문자열과 null 문자열을 구별하려면을 사용하는 것이 좋습니다 if len(string)
. 그렇지 않으면 if string
다른 사람들이 말한 것처럼 간단하게 사용하는 것이 좋습니다 . 공백으로 가득 찬 문자열에 대한 경고는 여전히 적용되므로 잊지 마십시오 strip
.
a = ''
b = ' '
a.isspace() -> False
b.isspace() -> True
a='a'
하면 얻을 수 a.isspace() -> False
있지만 a
해당 계정에는 빈 문자열이 아닙니다.
빈 문자열을 확인하기 위해 매번 하드 코딩 (sic) ""이 좋지 않습니다.
이렇게하는 foo == ""
것은 매우 나쁜 습관입니다. ""
마법의 가치입니다. 마법의 값 (보다 일반적으로 마법의 숫자 )을 확인해서는 안됩니다.
당신이해야 할 일은 설명 변수 이름과 비교하는 것입니다.
"empty_string"은 설명 변수 이름이라고 생각할 수 있습니다. 그렇지 않습니다 .
당신이 가기 전에 당신은 empty_string = ""
비교할 훌륭한 변수 이름이 있다고 생각합니다. 이것은 "설명 변수 이름"이 의미하는 것이 아닙니다.
좋은 설명 변수 이름은 해당 컨텍스트를 기반으로합니다. 빈 문자열 이 무엇인지 생각해야합니다 .
사용자가 값을 입력 할 수있는 양식을 작성 중입니다. 사용자가 무언가를 썼는지 확인하고 싶습니다.
좋은 변수 이름은 not_filled_in
이것은 코드를 매우 읽기 쉽게 만듭니다
if formfields.name == not_filled_in:
raise ValueError("We need your name")
CSV 파일을 구문 분석하고 빈 문자열을 다음과 같이 구문 분석하려고합니다. None
(CSV는 전적으로 텍스트를 기반으로하기 때문에 None
사전 정의 된 키워드를 사용 하지 않으면 나타낼 수 없습니다 )
좋은 변수 이름은 CSV_NONE
따라서 None
다른 문자열로 표시되는 새 CSV 파일이있는 경우 코드를 쉽게 변경하고 적용 할 수 있습니다.""
if csvfield == CSV_NONE:
csvfield = None
이 코드가 올바른지에 대해서는 의문의 여지가 없습니다. 그것이해야 할 일을하는 것이 분명합니다.
이것을 다음과 비교하십시오
if csvfield == EMPTY_STRING:
csvfield = None
첫 번째 질문은, 빈 줄은 왜 특별한 대우를 받아야합니까?
이것은 미래의 코더들에게 빈 문자열은 항상로 간주되어야 함을 알려줍니다 None
.
비즈니스 로직 (CSV 값 None
)과 코드 구현 (실제 비교 대상)을 혼합하기 때문입니다.
""
같은 마법의 값이 아닌 True
, False
또는 None
마법 값이 아니다.
이건 어때요? 아마도 "가장 우아하다"는 아니지만 꽤 완벽하고 분명해 보입니다.
if (s is None) or (str(s).strip()==""): // STRING s IS "EMPTY"...
@ 1290에 응답합니다. 주석에서 블록의 형식을 지정할 방법이 없습니다. None
값은 파이썬에서 빈 문자열이 아닌, 어느 쪽도 아니는 (공간)입니다. Andrew Clark의 답변은 맞습니다 if not myString
. @rouble의 답변은 응용 프로그램에 따라 다르며 OP의 질문에는 대답하지 않습니다. "공백"문자열에 대한 고유 한 정의를 채택하면 문제가 발생할 수 있습니다. 특히 표준 동작은 공백이 아닌 문자열 을 str(None)
생성 'None'
하는 것입니다.
그러나 None
및 (공백)을 "공백"문자열로 취급해야하는 경우 더 나은 방법은 다음과 같습니다.
class weirdstr(str):
def __new__(cls, content):
return str.__new__(cls, content if content is not None else '')
def __nonzero__(self):
return bool(self.strip())
예 :
>>> normal = weirdstr('word')
>>> print normal, bool(normal)
word True
>>> spaces = weirdstr(' ')
>>> print spaces, bool(spaces)
False
>>> blank = weirdstr('')
>>> print blank, bool(blank)
False
>>> none = weirdstr(None)
>>> print none, bool(none)
False
>>> if not spaces:
... print 'This is a so-called blank string'
...
This is a so-called blank string
예상되는 bool
문자열 동작을 방해하지 않으면 서 @rouble 요구 사항을 충족합니다 .
python -c "if (str(None) == 'None'): print ('OMG, WHY ??')"
문자열인지 확인하고 길이를 확인하기 때문에이 우아함을 발견했습니다.
def empty(mystring):
assert isinstance(mystring, str)
if len(mystring) == 0:
return True
else:
return False
-O
플래그를 설정하거나 PYTHONOPTIMIZE
env 변수를 설정 하면 최적화됩니다 .
파이썬 에서이 빈 값 또는 문자열 할당을 살펴볼 수 있습니다.
비어있는 문자열을 비교하는 것입니다. 따라서 공허함을 테스트하는 대신 not
문자열이 빈 문자열이 ""
있는 빈 문자열 과 같은지 테스트 할 수 있습니다 ...
아파치 StringUtils.isBlank 또는 Guava Strings.isNullOrEmpty 와 같은 동작을 기대하는 사람들을 위해 :
if mystring and mystring.strip():
print "not blank string"
else:
print "blank string"
이것이 누군가에게 유용한 경우, 여기에 빈 문자열을 N / A로 목록 목록 (파이썬 2)으로 대체하기 위해 작성한 빠른 기능이 있습니다.
y = [["1","2",""],["1","4",""]]
def replace_blank_strings_in_lists_of_lists(list_of_lists):
new_list = []
for one_list in list_of_lists:
new_one_list = []
for element in one_list:
if element:
new_one_list.append(element)
else:
new_one_list.append("N/A")
new_list.append(new_one_list)
return new_list
x= replace_blank_strings_in_lists_of_lists(y)
print x
이것은 특정 필드 (스키마에서 NN으로 표시 된 필드)에 대해 공백을 허용하지 않는 목록 목록을 mysql 데이터베이스에 게시하는 데 유용합니다. 필자의 경우 이것은 복합 기본 키 때문이었습니다.
prmatta가 위에 게시했지만 실수로.
def isNoneOrEmptyOrBlankString (myString):
if myString:
if not myString.strip():
return True
else:
return False
return False
""
및 " "
과 거짓 "a"
(다만 예상). 빈 문자열이 True를 반환하지 않아야하는 것을 제외하고는 코드가 동일하게 반환됩니다.
""
좋지 않습니까?