Лучший способ сделать "не None" тест в Python для нормальной строки и пустой строки Unicode? - PullRequest
19 голосов
/ 17 апреля 2011

В Python 2.7 я пишу класс, который вызывает функцию в API, которая может возвращать или не возвращать пустую строку.Кроме того, пустая строка может быть Unicode u"" или не Unicode "".Мне было интересно, что лучший способ проверить это?

Следующий код отлично работает для пустой строки, но не для пустой строки в Юникоде:

class FooClass():
    string = ...
    string = might_return_normal_empty_string_or_unicode_empty_string(string)

    # Works for normal empty strings, not unicode:
    if string is not None:
        print "string is not an empty string."

Вместо этого мне придетсянапишите это так, чтобы заставить его работать для Unicode:

class BarClass():
    string = ...
    string = might_return_normal_empty_string_or_unicode_empty_string(string)

    # Works for unicode empty strings, not normal:
    if string is not u"":
        print "string is not an empty string."

... и вот так, чтобы заставить его работать как для пустых строк в не-Unicode, так и Unicode:

class FooBarClass():
    string = ...
    string = might_return_normal_empty_string_or_unicode_empty_string(string)

    # Works for both normal and unicode empty strings:
    if string is not u"" or None:
        print "string is not an empty string."

Третий метод - лучший способ сделать это, или есть лучший способ?Я спрашиваю, потому что написание u"" кажется мне слишком жестким.Но если это лучший способ сделать это, пусть будет так.:) Спасибо за любую помощь, которую вы можете предложить.

Ответы [ 5 ]

45 голосов
/ 17 апреля 2011

Пустые строки считаются ложными.

if string:
    # String is not empty.
else:
    # String is empty.
5 голосов
/ 17 апреля 2011

Я должен оспорить ваше первое утверждение;

# Works for normal empty strings     <-- WRONG
if string is not None:
    print "string is not an empty string."

В Python 2.7.1 "" is not None оценивается как True - так что string="" приводит к string is not an empty string (что, безусловно, так и есть!).

Зачем вообще вводить None?

s = random_test_string()
s = API_call(s)

if len(s):
    # string is not empty
    pass
5 голосов
/ 17 апреля 2011

Вы никогда хотите использовать is с чем-либо, что не гарантировано, чтобы быть одиночным.Проверьте длину возвращаемого значения, и если это экземпляр unicode.

0 голосов
/ 23 ноября 2017

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

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

Я новый для Python, поэтому я еще не полностью разбираюсь в ' правильном ' использовании None. My Наиболее часто его используют при инициализации строк и списков. Если мой код когда-либо попадет в случай, когда я пытаюсь что-то сделать со строкой или списком, для которого мой код не имеет определенного значения, я хочу знать об этом. Я использую его как своего рода страховочную сеть.

if my_string is '': print('My string is NULL')
elif my_string is None : print('My string.... isn\'t')
else: print('My string is ' + my_string)
0 голосов
/ 17 апреля 2011

Проверьте что ?

if s is None:
    print "s is None"
else:
    if isinstance(s, unicode):
        print "s is unicode, %r" % s
    else:
        print "s is bytes, %r" % s

    if s:
        print "s is not empty"
    else:
        print "s is empty"

Просто проверьте сначала None, как обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...