Как проверить, пуста ли строка? - PullRequest
1183 голосов
/ 06 марта 2012

Есть ли в Python что-то вроде пустой строковой переменной, где вы можете сделать:

if myString == string.empty:

Независимо от того, какой самый элегантный способ проверить наличие пустых строковых значений?Я нахожу жесткое кодирование "" каждый раз для проверки пустой строки не таким хорошим.

Ответы [ 23 ]

1745 голосов
/ 06 марта 2012

Пустые строки "ложные" , что означает, что они считаются ложными в логическом контексте, поэтому вы можете просто сделать это:

if not myString:

Это предпочтительный способ, если вы знаете, что ваша переменная является строкой. Если ваша переменная также может быть другого типа, тогда вы должны использовать myString == "". См. Документацию по Проверка значений истины , чтобы узнать другие значения, которые являются ложными в булевых контекстах.

360 голосов
/ 06 марта 2012

С PEP 8 , в разделе «Рекомендации по программированию» :

Для последовательностей (строк, списков, кортежей) используйте фактчто пустые последовательности являются ложными.

Таким образом, вы должны использовать:

if not some_string:

или:

if some_string:

Просто чтобы уточнить, последовательности оцениваются до False или True в логическом контексте, если они пусты или нет.Они не равны False или True.

199 голосов
/ 06 марта 2012

Самый элегантный способ, вероятно, состоит в том, чтобы просто проверить, является ли он истинным или ложным, например ::

if not my_string:

Однако вы можете удалить пустое пространство, потому что:

 >>> bool("")
 False
 >>> bool("   ")
 True
 >>> bool("   ".strip())
 False

Вы, вероятно, должны быть немного более явными в этом, однако, если вы точно не знаете, что эта строка прошла какую-то проверку и является строкой, которая может быть проверена таким образом.

73 голосов
/ 02 июля 2014

Я бы проверил нонесс перед тем как убратьКроме того, я бы использовал тот факт, что пустые строки являются ложными (или ложными).Этот подход похож на StringUtils.isBlank в Apache или Strings.isNullOrEmpty в Guava *.Пустой ИЛИ Пустой:

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 Пустой NOR Пустой:

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())
39 голосов
/ 16 января 2015

Однажды я написал что-то похожее на ответ Бартека и вдохновил javascript:

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
12 голосов
/ 09 мая 2015

Проверка пустой или пустой строки (более короткий путь):

if myString.strip():
    print("it's not an empty or blank string")
else:
    print("it's an empty or blank string")
9 голосов
/ 06 марта 2012

Если вы хотите провести различие между пустыми и нулевыми строками, я бы предложил использовать if len(string), в противном случае я бы предложил просто if string, как говорили другие.Тем не менее, предостережение о строках, заполненных пробелами, остается в силе, поэтому не забудьте strip.

9 голосов
/ 18 апреля 2019

Единственный действительно надежный способ сделать это заключается в следующем:

if "".__eq__(myString):

Все другие решения имеют возможные проблемы и крайние случаи, когда проверка может не пройти.

len(myString)==0 может завершиться неудачейесли myString является объектом класса, который наследуется от str и переопределяет метод __len__().

Аналогичным образом myString == "" и myString.__eq__("") могут завершиться ошибкой, если myString переопределяет __eq__() и __ne__().

По какой-то причине "" == myString также одурачивается, если myString переопределяет __eq__().

myString is "" и "" is myString эквивалентны.Они оба потерпят неудачу, если myString на самом деле не строка, а подкласс строки (оба вернут False).Кроме того, поскольку они являются проверками идентичности, единственная причина, по которой они работают, заключается в том, что Python использует String Pooling (также называемый String Internment), который использует тот же экземпляр строки, если он интернирован (см. Здесь: Почему сравнение строк с использованиемили '==' или 'is' иногда дают другой результат? ).И "" интернируется с самого начала в CPython

Большая проблема с проверкой идентичности состоит в том, что String Internment (насколько я мог найти) не стандартизирует, какие строки интернируются.Это означает, что теоретически "" не является обязательным для интернирования, и это зависит от реализации.

Единственный способ сделать это, который действительно не может быть одурачен, - это упомянутый в начале: "".__eq__(myString).Так как это явно вызывает метод __eq__() для пустой строки, его нельзя обмануть, переопределив любые методы в myString, и он надежно работает с подклассами str.

. Также полагаться на ложность строки может не работать.если объект переопределяет, то это __bool__() метод.

Это не только теоретическая работа, но на самом деле может иметь отношение к реальному использованию, так как я видел фреймворки и библиотеки, создающие подклассы str ранее, и использование myString is "" может вернутьтам неправильный вывод.

Кроме того, сравнение строк с использованием is в целом является довольно злой ловушкой, поскольку иногда она будет работать правильно, но не в других случаях, поскольку объединение строк следует довольно странным правилам.

Тем не менее, в большинстве случаев все упомянутые решения будут работать правильно.Это пост в основном академическая работа.

6 голосов
/ 07 августа 2013
a = ''
b = '   '
a.isspace() -> False
b.isspace() -> True
6 голосов
/ 06 марта 2012

if stringname: дает false, когда строка пуста. Я думаю, это не может быть проще, чем это.

...