Есть ли в Python что-то вроде пустой строковой переменной, где вы можете сделать:
if myString == string.empty:
Независимо от того, какой самый элегантный способ проверить наличие пустых строковых значений? Я нахожу жесткое кодирование ""
каждый раз для проверки пустой строки не таким хорошим.
python
string
comparison-operators
Джоан Венге
источник
источник
""
не так хорошо?Ответы:
Пустые строки являются «ложными», что означает, что они считаются ложными в логическом контексте, так что вы можете просто сделать это:
Это предпочтительный способ, если вы знаете, что ваша переменная является строкой. Если ваша переменная также может быть другого типа, вы должны использовать
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 , в разделе «Рекомендации по программированию» :
Поэтому вы должны использовать:
или:
Просто чтобы прояснить, последовательность оценивается в
False
илиTrue
в логическом контексте , если они пустые или нет. Они не равны кFalse
илиTrue
.источник
x == False
. Но ИМХО разъяснения все же приветствуются с учетом целевой аудитории.Наиболее элегантный способ, вероятно, состоит в том, чтобы просто проверить, является ли он истинным или ложным, например:
Тем не менее, вы можете удалить пустое пространство, потому что:
Вы, вероятно, должны быть немного более явными в этом, однако, если вы точно не знаете, что эта строка прошла какую-то проверку и является строкой, которая может быть протестирована таким образом.
источник
Я бы проверил единство перед тем, как раздеться. Кроме того, я бы использовал тот факт, что пустые строки являются ложными (или ложными). Этот подход аналогичен Apache StringUtils.isBlank или Guava Strings.isNullOrEmpty.
Это то, что я бы использовал, чтобы проверить, является ли строка None, OR Empty или Blank:
И полная противоположность проверке, не является ли строка None NOR Empty NOR Blank:
Более краткие формы приведенного выше кода:
источник
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()
.Однажды я написал что-то похожее на ответ Бартека и вдохновил javascript:
Тестовое задание:
источник
return bool(s.strip())
AttributeError: 'NoneType' object has no attribute 'strip'
Единственный действительно надежный способ сделать это заключается в следующем:
У всех других решений есть возможные проблемы и крайние случаи, когда проверка может потерпеть неудачу.
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
в общем-то является довольно злой ловушкой, поскольку иногда она будет работать правильно, но не в других случаях, поскольку объединение строк следует довольно странным правилам.Тем не менее, в большинстве случаев все упомянутые решения будут работать правильно. Это пост в основном академическая работа.
источник
Проверить пустую или пустую строку (более короткий путь):
источник
myString = None
это вызовет исключение. Лучше использовать ответЕсли вы хотите провести различие между пустыми и нулевыми строками, я бы предложил использовать
if len(string)
, в противном случае я бы предложил использовать просто,if string
как говорили другие. Тем не менее, предостережение о строках, заполненных пробелами, остается в силе, так что не забывайтеstrip
.источник
if stringname:
дает,false
когда строка пуста. Я думаю, это не может быть проще, чем это.источник
Чистый код подход
Делать это:
foo == ""
очень плохая практика.""
это магическая ценность. Вы никогда не должны проверять магические значения (более известные как магические числа )Что вы должны сделать, это сравнить с описательным именем переменной.
Описательные имена переменных
Кто-то может подумать, что «empty_string» - это описательное имя переменной. Это не так .
Прежде чем идти и делать
empty_string = ""
и думать, у вас есть отличное имя переменной для сравнения. Это не то, что означает «описательное имя переменной».Хорошее описательное имя переменной основано на ее контексте. Вы должны думать о том, что пустая строка является .
Пример простого поля формы
Вы создаете форму, где пользователь может вводить значения. Вы хотите проверить, написал ли пользователь что-то или нет.
Хорошее имя переменной может быть
not_filled_in
Это делает код очень читабельным
Пример тщательного разбора CSV
Вы анализируете файлы CSV и хотите, чтобы пустая строка была проанализирована как
None
(Поскольку CSV полностью основан на тексте, он не может быть представлен
None
без использования предопределенных ключевых слов)Хорошее имя переменной может быть
CSV_NONE
Это облегчает изменение и адаптацию кода, если у вас есть новый файл CSV, представляющий
None
другую строку, чем""
Там нет вопросов о том, если этот кусок кода является правильным. Довольно ясно, что он делает то, что должен делать.
Сравните это с
Первый вопрос здесь: почему пустая строка заслуживает особого отношения?
Это скажет будущим кодировщикам, что пустая строка всегда должна рассматриваться как
None
.Это потому, что он смешивает бизнес-логику (какое должно быть значение CSV
None
) с реализацией кода (с чем мы на самом деле сравниваем)Должно быть разделение проблем между ними.
источник
""
это не значение магии, так же какTrue
,False
илиNone
не магические значения.источник
a='a'
вы получитеa.isspace() -> False
, ноa
не будет на этом счете пустой строкой.Как насчет этого? Возможно, это не «самый элегантный», но кажется довольно полным и ясным:
источник
Отвечая на @ 1290. Извините, нет возможности форматировать блоки в комментариях.
None
Значение не пустая строка в Python, и ни один (пространства). Ответ от Эндрю Кларка правильныйif not myString
. Ответ @rouble зависит от приложения и не отвечает на вопрос ОП. У вас будут проблемы, если вы примете своеобразное определение «пустой» строки. В частности, стандартное поведение является то , чтоstr(None)
производит'None'
, не-пустую строку.Однако, если вы должны рассматривать
None
и (пробелы) как «пустые» строки, вот лучший способ:Примеры:
Соответствует требованиям @rouble, не нарушая ожидаемое
bool
поведение строк.источник
python -c "if (str(None) == 'None'): print ('OMG, WHY ??')"
Я нахожу это элегантным, так как он проверяет, что это строка, и проверяет ее длину:
источник
-O
флаг или установитеPYTHONOPTIMIZE
переменную env.Другим простым способом может быть определение простой функции:
источник
Это выражение верно для пустых строк. Непустые строки, None и не строковые объекты будут создавать False с оговоркой, что объекты могут переопределять __str__, чтобы помешать этой логике, возвращая ложное значение.
источник
Вы можете взглянуть на это Назначение пустого значения или строки в Python
Речь идет о сравнении пустых строк. Таким образом, вместо проверки на пустоту
not
, вы можете проверить, равна ли ваша строка пустой строке с""
пустой строкой ...источник
для тех, кто ожидает такого поведения, как apache StringUtils.isBlank или Guava Strings.isNullOrEmpty :
источник
Когда вы читаете файл по строкам и хотите определить, какая строка пуста, убедитесь, что вы будете ее использовать
.strip()
, поскольку в «пустой» строке есть символ новой строки:источник
источник
Если вы просто используете
невозможно отличить переменную, которая является булевой,
False
от пустой строки''
:Однако, если вы добавите простое условие в ваш скрипт, разница будет:
источник
В случае, если это кому-то пригодится, я разработал быструю функцию замены пустых строк на N / A в списках списков (python 2).
Это полезно для публикации списков списков в базе данных mysql, которая не принимает пробелы для определенных полей (поля, помеченные как NN в схеме. В моем случае это произошло из-за составного первичного ключа).
источник
Я провел некоторые эксперименты со строками, такими как '', '', '\ n' и т. Д. Я хочу, чтобы isNotWhitespace был True, если и только если переменная foo является строкой, по крайней мере, с одним непробельным символом. Я использую Python 3.6. Вот чем я закончил:
Оберните это в определение метода, если хотите.
источник
Как написано выше, но с ошибкой.
источник
""
и" "
и Ложные для"a"
(так же , как и ожидалось). Ваш код возвращает то же самое, за исключением пустой строки, которая возвращает True, чего не должно быть.