【问题标题】:Python .get() does not evaluate to True even though there is an object?即使有一个对象,Python .get() 也不评估为 True?
【发布时间】:2012-02-17 11:40:19
【问题描述】:

我正在运行一个 Pylons 项目并遇到了这个奇怪的问题。提交表单时,我可以选择添加徽标(简单的 .png)。徽标在 FieldStorage 实例中传递。我尝试评估徽标是否与此一起发送:

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

但是,即使有徽标,它的计算结果也始终为 False。如果我打印 request.params 我得到UnicodeMultiDict([('logo', FieldStorage('logo', u'tux.png'))])

我解决了:

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

我不明白为什么会这样,而第一个例子没有。

【问题讨论】:

  • bool(FieldStorage('logo', u'tux.png')) 返回什么?
  • 这不能回答你的问题,但根据 pep8 你应该使用“is None”而不是“== None”。请参阅此处了解更多信息:stackoverflow.com/q/100732/1205715

标签: python pylons


【解决方案1】:

这很有趣,FieldStorage 对象以某种方式解析为 false。

这样写是完全合法的(稍微容易一点):

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

【讨论】:

    【解决方案2】:

    使用request.params.get('logo'),您将获得一个FieldStorage 对象,无论如何,它的计算结果可能为False

    无论如何,您只是在测试字典中是否存在 'logo' 键。你为什么不使用字典语义呢?没有检查,但我猜它支持类似的东西:

    if 'logo' in request.params:
        do x
    

    编辑:查看了代码。 UnicodeMultiDictUserDict.DictMixin 的子类,因此它实现了 __contains__ 并支持我的建议。

    【讨论】:

    • 是的,这也很好用。不过,我看不到 FieldStorage 中的逻辑评估为 False。
    • 去看看。不过,FieldStorage 是一个通用存储,只要在评估为布尔值时没有为它定义行为,我就不需要它遵循一定的逻辑。
    猜你喜欢
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2021-12-15
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多