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

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

if myString == string.empty:

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

Ответы [ 23 ]

5 голосов
/ 04 октября 2016

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

Подход с чистым кодом

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

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

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

Можно подумать, что "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) с реализацией кода (что мы на самом делепо сравнению с)

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

3 голосов
/ 02 мая 2017

Отвечая на @ 1290.Извините, нет возможности форматировать блоки в комментариях.Значение None не является пустой строкой в ​​Python и не является пробелами.Ответ от Эндрю Кларка правильный: if not myString.Ответ @rouble зависит от приложения и не отвечает на вопрос ОП.У вас будут проблемы, если вы примете своеобразное определение «пустой» строки.В частности, стандартное поведение заключается в том, что str(None) создает 'None', непустую строку.

Однако, если вы должны трактовать None и (пробелы) как "пустые" строки, здесь лучшеway:

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 поведения строк.

3 голосов
/ 28 октября 2015

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

if (s is None) or (str(s).strip()==""): // STRING s IS "EMPTY"...
2 голосов
/ 09 января 2019

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

def empty(mystring):
    assert isinstance(mystring, str)
    if len(mystring) == 0:
        return True
    else:
        return False
0 голосов
/ 24 февраля 2014

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

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

0 голосов
/ 11 апреля 2019

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

def isStringEmpty(inputString):
    if len(inputString) == 0:
        return True
    else:
        return False
0 голосов
/ 06 февраля 2019

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

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

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 голосов
/ 17 мая 2018
str = ""
if not str:
   print "Empty String"
if(len(str)==0):
   print "Empty String"
0 голосов
/ 25 февраля 2018
not str(myString)

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

...