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