Python에는 다음을 수행할 수 있는 빈 문자열 변수와 같은 것이 있습니까?
if myString == string.empty:
그럼에도 불구하고 빈 문자열 값을 확인하는 가장 우아한 방법은 무엇입니까? 빈 문자열을 검사할 때마다 하드 코딩 ""
질문자 :Joan Venge
Python에는 다음을 수행할 수 있는 빈 문자열 변수와 같은 것이 있습니까?
if myString == string.empty:
그럼에도 불구하고 빈 문자열 값을 확인하는 가장 우아한 방법은 무엇입니까? 빈 문자열을 검사할 때마다 하드 코딩 ""
빈 문자열은 "falsy"( python 2 또는 python 3 참조)입니다. 즉, 부울 컨텍스트에서 false로 간주되므로 다음과 같이 하면 됩니다.
if not myString:
변수가 문자열이라는 것을 알고 있는 경우 선호되는 방법입니다. 변수가 다른 유형일 수도 있다면 myString == ""
를 사용해야 합니다. 부울 컨텍스트에서 거짓인 다른 값 에 대해서는 진실 값 테스트에 대한 문서를 참조하십시오.
시퀀스(문자열, 목록, 튜플)의 경우 빈 시퀀스가 거짓이라는 사실을 사용합니다.
따라서 다음을 사용해야 합니다.
if not some_string:
또는:
if some_string:
명확히하기 위해 시퀀스는 비어 있는지 여부에 관계없이 부울 컨텍스트에서 False
또는 True
로 평가 됩니다. False
또는 True
같지 않습니다 .
가장 우아한 방법은 아마도 참인지 거짓인지 간단히 확인하는 것입니다. 예:
if not my_string:
그러나 다음과 같은 이유로 공백을 제거할 수 있습니다.
>>> bool("") False >>> bool(" ") True >>> bool(" ".strip()) False
그러나 이 문자열이 일종의 유효성 검사를 통과했으며 이러한 방식으로 테스트할 수 있는 문자열이라는 것을 확실히 알지 못하는 경우에는 이 부분에서 좀 더 명시적이어야 합니다.
나는 벗기기 전에 무의미함을 시험할 것이다. 또한 빈 문자열이 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())
나는 Bartek의 답변과 자바 스크립트 영감과 비슷한 것을 한 번 썼습니다.
def is_not_blank(s): return bool(s and not s.isspace())
시험:
print is_not_blank("") # False print is_not_blank(" ") # False print is_not_blank("ok") # True print is_not_blank(None) # False
이를 수행하는 유일한 확실한 방법은 다음과 같습니다.
if "".__eq__(myString):
다른 모든 솔루션에는 검사가 실패할 수 있는 가능한 문제와 극단적인 경우가 있습니다.
len(myString)==0
myString
str
__len__()
메서드를 재정의하는 클래스의 객체인 경우 실패할 수 있습니다.
유사하게 myString == ""
및 myString.__eq__("")
myString
__eq__()
및 __ne__()
재정의하는 경우 실패할 수 있습니다.
어떤 이유로 "" == myString
myString
__eq__()
재정의하는 경우에도 속게 됩니다.
myString is ""
이고 "" is myString
입니다. myString
이 실제로 문자열이 아니라 문자열의 하위 클래스인 경우 둘 다 실패 False
를 반환함). 또한, 그것들이 신원 확인이기 때문에 그들이 작동하는 유일한 이유는 파이썬이 인턴인 경우 동일한 문자열 인스턴스를 사용하는 문자열 풀링(String Internment라고도 함)을 사용하기 때문입니다(여기 참조: 왜 '=를 사용하여 문자열을 비교합니까? =' 또는 'is'가 때때로 다른 결과를 생성합니까? ). 그리고 ""
는 CPython에서 처음부터 인턴
신원 확인의 가장 큰 문제는 String Internment가 (내가 찾을 수 있는 한) 어떤 문자열이 수용되는지 표준화되어 있지 않다는 것입니다. 즉, 이론적으로 ""
인턴이 필요하지 않으며 구현에 따라 다릅니다.
실제로 속일 수 없는 유일한 방법은 처음에 언급한 "".__eq__(myString)
입니다. 이것은 명시적으로 __eq__()
메서드를 호출하기 때문에 myString 의 메서드를 재정의하여 속일 수 없으며 str
하위 클래스와 견고하게 작동합니다.
__bool__()
메서드를 재정의하면 문자열의 거짓에 의존하는 것이 작동하지 않을 수 있습니다.
이것은 이론적인 작업일 뿐만 아니라 실제로 실제 사용과 관련이 있을 수 있습니다. 이전에 str
myString is ""
사용하면 ""이 잘못된 출력을 반환할 수 있기 때문입니다.
또한, 사용하여 문자열을 비교하는 is
문자열 풀링 꽤 이상한 규칙을 따르기 때문에 일반적으로는, 제대로 가끔 작동하기 때문에 매우 사악한 함정이 있지만 다른 시간에.
즉, 대부분의 경우 언급된 모든 솔루션이 올바르게 작동합니다. 이 게시물은 대부분 학술 작업입니다.
빈 문자열 또는 빈 문자열 테스트(짧은 방법):
if myString.strip(): print("it's not an empty or blank string") else: print("it's an empty or blank string")
빈 문자열과 null 문자열을 구별하려면 if len(string)
사용하는 것이 좋습니다. 그렇지 않으면 다른 사람들이 말한 대로 if string
을 사용하는 것이 좋습니다. 공백으로 가득 찬 문자열에 대한 주의 사항은 여전히 적용되므로 strip
하는 것을 잊지 마십시오.
if stringname:
문자열이 비어 있으면 false
제공합니다. 이보다 간단할 수는 없는 것 같아요.
빈 문자열을 검사할 때마다 하드코딩(원문 그대로) ""이 좋지 않습니다.
이렇게 하면: 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
이어야 함)과 코드 구현(실제로 비교 대상)을 혼합하기 때문입니다.
둘 사이 에 관심 의 분리가 필요합니다.
a = '' b = ' ' a.isspace() -> False b.isspace() -> True
이것은 어떤가요? 아마도 "가장 우아한" 것은 아니지만 꽤 완전하고 명확해 보입니다.
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 요구 사항을 충족합니다.
'', ' ', '\n' 등과 같은 문자열로 몇 가지 실험을 했습니다. foo 변수가 공백이 아닌 문자가 하나 이상 있는 문자열인 경우에만 isNotWhitespace가 True가 되기를 바랍니다. 저는 파이썬 3.6을 사용하고 있습니다. 내가 끝내는 것은 다음과 같습니다.
isWhitespace = str is type(foo) and not foo.strip() isNotWhitespace = str is type(foo) and not not foo.strip()
원하는 경우 이를 메서드 정의에 래핑합니다.
not str(myString)
이 표현식은 비어 있는 문자열에 대해 True입니다. 비어 있지 않은 문자열, None 및 문자열이 아닌 객체는 모두 False를 생성하며 객체가 __str__을 재정의하여 거짓 값을 반환하여 이 논리를 방해할 수 있다는 경고와 함께.
파일을 줄 단위로 읽을 때 어떤 줄이 비어 있는지 확인하려면 "빈" 줄에 새 줄 문자 .strip()
lines = open("my_file.log", "r").readlines() for line in lines: if not line.strip(): continue # your code for non-empty lines
Python에서 빈 값 또는 문자열 할당하기를 참조 할 수 있습니다.
이것은 비어 있는 문자열을 비교하는 것입니다. not
으로 공백을 테스트하는 대신 ""
빈 문자열이 있는 빈 문자열과 같은지 테스트할 수 있습니다.
Apache StringUtils.isBlank 또는 Guava Strings.isNullOrEmpty 와 같은 동작을 기대하는 사람들을 위해:
if mystring and mystring.strip(): print "not blank string" else: print "blank string"
그냥 사용한다면
not var1
False
변수와 빈 문자열 ''
을 구별하는 것은 불가능합니다.
var1 = '' not var1 > True var1 = False not var1 > True
그러나 스크립트에 간단한 조건을 추가하면 차이가 발생합니다.
var1 = False not var1 and var1 != '' > True var1 = '' not var1 and var1 != '' > False
이것이 누군가에게 유용한 경우를 위해 목록 목록(python 2)에서 빈 문자열을 N/A로 교체하기 위해 만든 빠른 기능이 있습니다.
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
출처 : http:www.stackoverflow.com/questions/9573244/how-to-check-if-the-string-is-empty
HTML의 기본값을 설정하는 방법<select> 요소? (0) | 2022.01.05 |
---|---|
저장소를 사용하지 않고 한 호스트에서 다른 호스트로 Docker 이미지를 복사하는 방법 (0) | 2022.01.05 |
jQuery를 사용하여 양식 데이터를 JavaScript 객체로 변환 (0) | 2022.01.05 |
코드의 모든 섹션을 축소하는 명령? (0) | 2022.01.05 |
JavaScript에서 객체의 키/속성 수를 효율적으로 계산하는 방법 (0) | 2022.01.05 |