【问题标题】:Why do function objects evaluate to True in python?为什么函数对象在 python 中评估为 True?
【发布时间】:2012-09-23 17:20:32
【问题描述】:

在 python 中,可以进行如下构造:

def a(): 
    return 0

if a: 
    print "Function object was considered True"
else:  
    print "Function object was considered False"

我想问一个函数指针被评估为真的逻辑是什么。

为什么要在语言中插入这种结构?

【问题讨论】:

  • 你能发布更多上下文吗? a 是否在其他任何地方定义?
  • 这个页面进入了一些你可能想要使用这个功能的原因:anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/boolean.html
  • 与任何编程语言相同...任何不评估为 false 的内容将评估为 true ...评估为 false 的内容更容易枚举 (0,False,None,[ ],""等)

标签: python function function-pointers


【解决方案1】:

在 Python 中,很多东西都会计算为 True。来自documentation on Boolean operators:

在布尔运算的上下文中,以及当控制流语句使用表达式时,以下值被解释为 false:False、None、所有类型的数字零以及空字符串和容器(包括字符串、元组、列表、字典、集合和冻结集)。所有其他值都被解释为 true。

Python 中的函数和很多东西一样,都是对象,而不是空的。因此,在布尔上下文中,它们的计算结果为 True。

【讨论】:

  • @MagnusHoff:感谢指正;没有注意到散列片段丢失了,我当然打算包括在内。
【解决方案2】:

评估“真实性”的规则在 Python 文档章节中Truth Value Testing。

特别注意

所有其他值都被认为是真实的——所以许多类型的对象都是 永远正确。

总之;函数对象始终为真。

【讨论】:

    【解决方案3】:

    python 中为 False 的对象列表:

    • None
    • []
    • {}
    • empty set
    • empty frozenset
    • False
    • 0
    • 0.0
    • 0L
    • 0j
    • 空defaultdict
    • Classes 已实现 __nonzero__() 方法并返回一个虚假值 否则 __len__() 被调用。在 python 3x 中将__bool__() 替换为__nonzero__()。

    【讨论】:

    • 还有 0.0.和 0j。和0L。或者长度为0,或者__nonzero__()方法返回False。
    • 您应该添加__len__(),因为它是在没有定义__nonzero__() 时进行评估的。另请注意,__bool__() 替换了 Python 3.x 的 __nonzero__()
    【解决方案4】:

    在@Magnus Hoff 链接到的真值测试中,我发现最有启发性的陈述是:

    默认情况下,除非其类定义返回 False 的 _bool_() 方法或返回 _len_() 方法,否则对象被默认为真零,当与对象一起调用时。

    我尝试定义自己的类,似乎 _bool_() 优先于 _len_(),这是有道理的:

    class Falsish(object):
        def __init__(self):
            self.val = "False, even though len(self) > 0"
        def __bool__(self):
            return False
        def __len__(self):
            return 2
    
    class StillFalsish(object):
        def __init__(self):
            self.val = "False, even though len(self) > 0"
        def __len__(self):
            return 2
        def __bool__(self):
            return False
    
    class Truish(object):
        def __init__(self):
            self.val = "True, even though len(self) = 0"
        def __bool__(self):
            return True
        def __len__(self):
            return 0
    
    class StillTruish(object):
        def __init__(self):
            self.val = "True, even though len(self) = 0"
        def __len__(self):
            return 0
        def __bool__(self):
            return True
    
    class NowFalsish(object):
        def __init__(self):
            self.val = "False, with no __bool__(), since len(self) = 0"
        def __len__(self):
            return 0
    
    class NowTruish(object):
        def __init__(self):
            self.val = "True, with no __bool__(), since len(self) > 0"
        def __len__(self):
            return 2
    
    class EvenThisIsTruish(object):
        pass
    
    
    mybool1 = Falsish()
    mybool2 = StillFalsish()
    mybool3 = Truish()
    mybool4 = StillTruish()
    mybool5 = NowFalsish()
    mybool6 = NowTruish()
    mybool7 = EvenThisIsTruish()
    if mybool1: print("mybool1 is true")
    if mybool2: print("mybool2 is true")
    if mybool3: print("mybool3 is true")
    if mybool4: print("mybool4 is true")
    if mybool5: print("mybool5 is true")
    if mybool6: print("mybool6 is true")
    if mybool7: print("mybool7 is true")
    

    以上代码的输出为:

    mybool3 is true
    mybool4 is true
    mybool6 is true
    mybool7 is true
    

    【讨论】:

      猜你喜欢
      • 2013-09-02
      • 2019-06-30
      • 2013-11-11
      • 1970-01-01
      • 2014-06-17
      • 2015-03-15
      • 2012-01-24
      • 1970-01-01
      • 2010-11-26
      相关资源
      最近更新 更多