Дополнительно
Как проверить, пуста ли строка?
Есть ли в Python что-то вроде пустой строковой переменной, где можно сделать:
if myString == string.empty:
Независимо от этого, какой самый элегантный способ проверки пустой строки? Я считаю, что жесткое кодирование `""" каждый раз для проверки пустой строки не так хорошо.
1271
20
Пустые строки являются "falsy", что означает, что они считаются ложными в булевом контексте, поэтому вы можете просто сделать это:
Этот способ предпочтителен, если вы знаете, что ваша переменная является строкой. Если ваша переменная может быть и другого типа, то вам следует использовать
myString == ""
. О других значениях, которые являются ложными в булевых контекстах, см. документацию по Проверке истинности значения.Из PEP 8, в разделе "Рекомендации по программированию":
Поэтому вы должны использовать:
или:
Чтобы уточнить, последовательности оцениваются в
False
илиTrue
в булевом контексте, если они пусты или нет. Они не равныFalse
илиTrue
.Наиболее элегантным способом, вероятно, будет просто проверить, является ли он истинным или ложным, например:
Однако, возможно, вы захотите убрать пробелы, потому что:
Однако, вероятно, вам следует быть немного более явным, если только вы не знаете наверняка, что эта строка прошла некоторую проверку и может быть проверена таким образом.
Я бы проверил небытие перед тем, как раздеться. Кроме того, я бы использовал тот факт, что пустые строки являются ложными (или фальси). Этот подход аналогичен StringUtils.isBlank Apache или Strings.isNullOrEmpty Гуавы
Это то, что я бы использовал для проверки, если строка либо None ИЛИ Empty ИЛИ Blank:
И полная противоположность тесту, если строка не NOR Empty NOR Blank:
Более краткие формы вышеуказанного кода:
Однажды я написал нечто похожее на ответ Бартека и вдохновленный JavaScript:
Тест:
Единственный действительно надежный способ сделать это - следующее:
Все другие решения имеют возможные проблемы и крайние случаи, когда проверка может не пройти.
len (myString) == 0
может завершиться ошибкой, еслиmyString
является объектом класса, который наследует отstr
и переопределяет метод__len__ ()
.Аналогично
myString == ""
иmyString.__eq__ ("")
может завершиться ошибкой, еслиmyString
переопределяет__eq__ ()
и__ne__ ()
.По какой-то причине
" "== myString
также одурачен, еслиmyString
переопределяет__eq__ ()
.myString is ""
и" "myString
эквивалентны. Они оба потерпят неудачу, еслиmyString
на самом деле не строка, а подкласс строки (оба вернутFalse
). Кроме того, поскольку они являются проверками личности, единственная причина, по которой они работают, заключается в том, что Python использует String Pooling (также называемый String Internment), который использует тот же экземпляр строки, если она интернирована (см. Здесь: https://stackoverflow.com/questions / 1504717 / why-comparing-strings-using-using-y-is-is-is-is-is-is-is-is-a-differe). И" "
интернирован с самого начала в CPythonБольшая проблема с проверкой личности заключается в том, что String Internment (насколько я мог судить) не стандартизирует, какие строки интернированы. Это означает, что теоретически `" "" не является необходимым интернированным, и это зависит от реализации.
Единственный способ сделать это, который действительно нельзя одурачить, - это упомянутый в начале:
" ".__eq__ (myString)
. Поскольку это явно вызывает метод__eq__ ()
пустой строки, его нельзя одурачить, переопределив любые методы в myString и прочно работает с подклассамиstr
.Также полагаться на ложность строки может не сработать, если объект переопределяет метод
__bool__ ()
.Это не только теоретическая работа, но на самом деле может иметь отношение к реальному использованию, поскольку я видел, что фреймворки и библиотеки, подклассифицирующие
str
до и использующие `myString is "", могут вернуть туда неправильный вывод.Кроме того, сравнение строк с использованием
is
в целом является довольно злой ловушкой, поскольку иногда она будет работать правильно, но не в другое время, поскольку объединение строк следует довольно странным правилам.Тем не менее, в большинстве случаев все упомянутые решения будут работать правильно. Это пост в основном академическая работа.
Проверьте пустую или пустую строку (более короткий путь):
Если вы хотите различать пустые и нулевые строки, я бы предложил использовать
if len (string)
, в противном случае я бы предложил использовать простоif string
, как говорили другие. Предостережение о струнах, полных пробелов, все еще применимо, поэтому не забудьте «полосать».if stringname:
имеетсяfalse
, когда строка пуста. Я думаю, это не может быть проще, чем это.Чистый подход к коду
Делать это:
foo == ""
это очень плохая практика." "
- магическая ценность. Вы никогда не должны проверять магические значения (более известные как магические числа)Что вам нужно сделать, это сравнить с именем описательной переменной.
Описательные имена переменных
Можно подумать, что «empty_string» - это описательное имя переменной. Это не .
Прежде чем идти и делать
empty_string = ""
и думать, что у вас есть отличное имя переменной для сравнения. Это не то, что означает «имя описательной переменной».Хорошее описательное имя переменной основано на ее контексте. Вы должны подумать о том, что пустая строка есть .
Простой пример поля формы
Вы создаете форму, в которой пользователь может вводить значения. Вы хотите проверить, написал ли пользователь что-то или нет.
Хорошее имя переменной может быть
not_filled_in
Это делает код очень читабельным
Пример тщательного анализа CSV
Вы анализируете файлы CSV и хотите, чтобы пустая строка была проанализирована как
None
(Поскольку CSV полностью основан на тексте, он не может представлять «Нет» без использования предопределенных ключевых слов)
Хорошее имя переменной может быть
CSV_NONE
Это позволяет легко изменять и адаптировать код, если у вас есть новый файл CSV, который представляет «Нет» с другой строкой, чем «»
Нет вопросов о том, является ли этот фрагмент кода правильным. Совершенно очевидно, что он делает то, что должен делать.
Сравните это с
Первый вопрос здесь: почему пустая строка заслуживает особого отношения??
Это скажет будущим кодировщикам, что пустую строку всегда следует рассматривать как «Нет».
Это связано с тем, что он смешивает бизнес-логику (какое значение CSV должно быть «Нет») с реализацией кода (с чем мы на самом деле сравниваем)
Между ними должно быть разделение беспокойства.
Как насчет этого? Возможно, это не «самый элегантный», но кажется довольно полным и ясным:
Отвечая на @ 1290. Извините, нет способа форматировать блоки в комментариях. Значение
None
не является пустой строкой в Python, равно как и (пробелы). Ответ Эндрю Кларка правильный: «если не myString». Ответ от @rouble зависит от приложения и не отвечает на вопрос OP. У вас будут проблемы, если вы примете своеобразное определение того, что такое «пустая» строка. В частности, стандартное поведение заключается в том, чтоstr (None)
производит'None'
, непустую строку.Однако, если вы должны рассматривать «Нет» и (пробелы) как «пустые» строки, вот лучший способ:
Примеры:
Соответствует требованиям @rouble, не нарушая ожидаемого поведения строк
bool
.Я нахожу это элегантным, так как он гарантирует, что это строка, и проверяет ее длину:
Другим простым способом может быть определение простой функции:
Если вы просто используете
невозможно отличить переменную, которая является логической
False
, от пустой строки'
:Однако, если вы добавите простое условие в свой скрипт, разница будет сделана:
Если это кому-то полезно, вот быстрая функция, которую я создал для замены пустых строк на N / A в списках списков (python 2).
Это полезно для публикации списков списков в базе данных mysql, которая не принимает пробелы для определенных полей (поля, помеченные как NN в схеме. в моем случае это было связано с составным первичным ключом).
для тех, кто ожидает такого поведения, как apache StringUtils.isBlank или Guava Strings.isNullOrEmpty:
Когда вы читаете файл по строкам и хотите определить, какая строка пуста, убедитесь, что вы будете использовать
.strip ()
, потому что в «пустой» строке есть новый символ строки: