Python .get () не оценивается как True, даже если есть объект? - PullRequest
4 голосов
/ 17 февраля 2012

Я запускаю проект Pylons и столкнулся с этой странной проблемой.При отправке формы у меня есть возможность добавить логотип (простой .png).Логотип передается в экземпляре FieldStorage.Я пытаюсь оценить, был ли логотип отправлен следующим образом:

if request.params.get('logo'):
    do x

Однако, это всегда оценивается как Ложь, даже если логотип есть.Если я печатаю request.params, я получаю UnicodeMultiDict([('logo', FieldStorage('logo', u'tux.png'))]).

Я решил это с помощью:

if not request.params.get('logo') == None:
    do x

Я не понимаю, почему это работает, а первый пример - нет.

Ответы [ 2 ]

5 голосов
/ 17 февраля 2012

Это интересно, как-то объект FieldStorage преобразуется в false.

Совершенно законно написать следующее (немного проще):

if request.params.get('logo') is not None:
    # do x
3 голосов
/ 17 февраля 2012

С request.params.get('logo') вы получаете FieldStorage объект, который, вероятно, оценивается как False, несмотря ни на что.

В любом случае, вы просто проверяете наличие ключа 'logo' в словаре. Почему бы вам не использовать словарную семантику для этого? Не проверял, но я думаю, что он поддерживает что-то вроде:

if 'logo' in request.params:
    do x

Редактировать: посмотрел код. UnicodeMultiDict является подклассом UserDict.DictMixin, поэтому он реализует __contains__ и поддерживает то, что я предложил.

...