it-swarm.com.ru

Самый элегантный способ проверить, является ли строка пустой в Python?

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

if myString == string.empty:

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

1067
Joan Venge

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

if not myString:

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

1585
Andrew Clark

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

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

Так что вы должны использовать:

if not some_string:

или же:

if some_string:

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

328
zenpoy

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

if not my_string:

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

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

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

183
Bartek

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

Это то, что я хотел бы использовать, чтобы проверить, является ли строка None OR Пусто OR Пусто:

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())
66
rouble

Однажды я написал что-то похожее на ответ Бартека и вдохновил 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
30
vault

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

if myString.strip():
    print("it's not an empty or blank string")
else:
    print("it's an empty or blank string")
12
prrvchr

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

9
Silas Ray
if my_string is '':

Я не заметил ЭТОЙ конкретной комбинации ни в одном из ответов. Я искал 

is ''

в ответах до публикации. 

 if my_string is '': print ('My string is EMPTY') # **footnote

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

if my_string is '':
    print('My string is EMPTY')
else:
    print(f'My string is {my_string}')

Персонаж за характером Я думаю, что это хорошее решение.

Я отметил, что None вступил в дискуссию, поэтому, добавив это и сжимая дальше, мы получаем:

if my_string is '': print('My string is Empty')
Elif my_string is None : print('My string.... isn\'t')
else: print(f'My string is {my_string}')
9
MikeyB
a = ''
b = '   '
a.isspace() -> False
b.isspace() -> True
6
Roman Semirook

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

5
Kakashi

Я нахожу жесткое кодирование (sic) "" каждый раз для проверки пустой строки не таким хорошим.

Чистый код подход

Делать это: foo == "" очень плохая практика. "" - магическое значение. Вы никогда не должны проверять магические значения (более известные как магические числа )

Что вы должны сделать, это сравнить с описательным именем переменной.

Описательные имена переменных

Кто-то может подумать, что "empty_string" - это описательное имя переменной. Это не.

Прежде чем идти и делать empty_string = "", подумайте, что у вас есть отличное имя переменной для сравнения. Это не то, что означает «описательное имя переменной».

Хорошее описательное имя переменной основано на ее контексте .. Вы должны подумать, что такое пустая строка [.

  • Откуда это взялось. 
  • Почему это там? 
  • Почему вы должны проверить это.

Пример простого поля формы

Вы создаете форму, где пользователь может вводить значения. Вы хотите проверить, написал ли пользователь что-то или нет.

Хорошее имя переменной может быть not_filled_in

Это делает код очень читабельным

if formfields.name == not_filled_in:
    raise ValueError("We need your name")

Пример тщательного разбора CSV

Вы анализируете файлы CSV и хотите, чтобы пустая строка была проанализирована как None

(Поскольку CSV полностью основан на тексте, он не может представлять None без использования предопределенных ключевых слов)

Хорошее имя переменной может быть CSV_NONE

Это позволяет легко изменять и адаптировать код, если у вас есть новый CSV-файл, представляющий None со строкой, отличной от ""

if csvfield == CSV_NONE:
    csvfield = None

Там нет вопросов о том, если этот кусок кода является правильным. Довольно ясно, что он делает то, что должен делать.

Сравните это с

if csvfield == EMPTY_STRING:
    csvfield = None

Первый вопрос здесь: почему пустая строка заслуживает особого отношения?

Это скажет будущим кодировщикам, что пустая строка всегда должна рассматриваться как None.

Это потому, что он смешивает бизнес-логику (какое значение CSV должно быть None) с реализацией кода (с чем мы на самом деле сравниваем)

Должно быть разделение проблем между ними.

4
firelynx

Либо следующее

foo is ''

или даже

empty = ''
foo is empty
4
geckos

Как насчет этого? Возможно, это не «самый элегантный», но кажется довольно полным и ясным:

if (s is None) or (str(s).strip()==""): // STRING s IS "EMPTY"...
3
BuvinJ

Отвечая на @ 1290. Извините, нет возможности форматировать блоки в комментариях. Значение None не является пустой строкой в ​​Python и не является пробелами. Ответ от Эндрю Кларка правильный: if not myString. Ответ @rouble зависит от конкретного приложения и не отвечает на вопрос ОП. У вас будут проблемы, если вы примете своеобразное определение «пустой» строки. В частности, стандартное поведение состоит в том, что 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

Отвечает требованиям @rouble, не нарушая ожидаемое поведение строк bool.

2
Chris Johnson

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

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 в целом является довольно злой ловушкой, поскольку иногда она будет работать правильно, но не в других случаях, поскольку объединение строк следует довольно странным правилам.

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

2
Dakkaron
not str(myString)

Это выражение верно для пустых строк. Непустые строки, None и нестроковые объекты будут создавать False с оговоркой, что объекты могут переопределять __str__, чтобы помешать этой логике, возвращая ложное значение.

1
Fax
str = ""
if not str:
   print "Empty String"
if(len(str)==0):
   print "Empty String"
0
Tanmoy Datta

Другим простым способом может быть определение простой функции:

def isStringEmpty(inputString):
    if len(inputString) == 0:
        return True
    else:
        return False
0
tanzil

Если вы просто используете 

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
0
jberrio

Вы можете взглянуть на это Назначение пустого значения или строки в Python

Речь идет о сравнении пустых строк. Таким образом, вместо проверки на пустоту с not, вы можете проверить, равна ли ваша строка пустой строке с "" пустой строкой ...

0
octoback

В случае, если это кому-то пригодится, я разработал быструю функцию замены пустых строк на N/A в списках списков (python 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

Это полезно для публикации списков списков в базе данных mysql, которая не принимает пробелы для определенных полей (поля, помеченные как NN в схеме. В моем случае это произошло из-за составного первичного ключа).

0
FlyingZebra1

для тех, кто ожидает поведение, подобное Apache StringUtils.isBlank или Guava Strings.isNullOrEmpty :

if mystring and mystring.strip():
    print "not blank string"
else:
    print "blank string"
0
kommradHomer

Я нахожу это элегантным, так как он проверяет, что это строка, и проверяет ее длину:

def empty(mystring):
    assert isinstance(mystring, str)
    if len(mystring) == 0:
        return True
    else:
        return False
0
cardamom

Когда вы читаете файл по строкам и хотите определить, какая строка пуста, убедитесь, что вы будете использовать .strip(), поскольку в «пустой» строке есть символ новой строки:

lines = open("my_file.log", "r").readlines()

for line in lines:
    if not line.strip():
        continue

    # your code for non-empty lines
0
Pavel Štěrba