【问题标题】:Why python designed as str(None) return 'None' instead of an empty string?为什么设计为 str(None) 的 python 返回 'None' 而不是空字符串?
【发布时间】:2013-07-15 11:51:14
【问题描述】:

在我知道的其他一些语言中,null 到字符串转换的直观结果应该是一个空字符串。 为什么 Python 旨在使“无”成为一种特殊的字符串? 当检查函数的返回值时,这可能会导致额外的工作

result = foo() # foo will return None if failure 
if result is not None and len(str(result)) > 0:
    # ... deal with result 
    pass 

如果 str(None) 返回空字符串,代码可以更短:

if len(str(result)) > 0:
    # ... deal with result 
    pass 

看起来 Python 试图变得冗长,以使日志文件更易于理解?

【问题讨论】:

  • 这并不能真正回答你的问题,但它确实绕过了你的问题。 bool(None) == False,但 bool('') == False。所以实际上你只需要检查if result: #pass,因为''None 都评估为False。我会尝试找出选择 str(None) == 'None' 的一些原因,但如果您只是检查是否返回了正确的字符串,我认为它不会影响您的代码。
  • 这只是额外的工作,因为您定义的条件很尴尬:“仅在结果不是 None 或其字符串表示不为空时才处理结果”。使用更传统的检查方式(如@pswaminathan 建议的那样),问题就会消失。
  • 如果foo在失败的情况下返回None,则需要检查None。在您的示例中,任何字符串表示为空的内容显然都与None 处理相同,但是没有特别的理由说明这应该是默认行为。问题是,你为什么要使用“str(x) 的长度”作为任何东西的诊断?
  • 其实我觉得这是一个很好的问题。很容易看出为什么repr(None) 应该是'None',但为什么str(None) 不应该是''
  • @BobL:为了记录,Python 在这方面并不是唯一的。例如,在 Java 中,将 null 转换为字符串会产生文字字符串 "null"。参考:JLS 5.1.11.

标签: python


【解决方案1】:

通过检查len(str(result)) 来检查字符串中是否包含字符绝对不是pythonic(请参阅http://www.python.org/dev/peps/pep-0008/)。

result = foo() # foo will return None if failure 
if result:
    # deal with result.
    pass

None'' 强制转换为布尔值 False


如果您真的要问为什么str(None) 确实返回'None',那么我相信这是因为three-valued logic 是必需的。 TrueFalseNone可以一起使用来判断一个逻辑表达式是TrueFalse还是不能判断。恒等函数是最容易表示的。

True  -> 'True'
False -> 'False'
None  -> 'None'

如果str(None)'',以下内容会很奇怪:

>>> or_statement = lambda a, b: "%s or %s = %s" % (a, b, a or b)
>>> or_statement(True, False)
'True or False = True'
>>> or_statement(True, None)
'True or None = True'
>>> or_statement(None, None)
'None or None = None'

现在,如果您真的想要一个权威的答案,请咨询 Guido。


如果你真的想拥有str(None) 给你'',请阅读另一个问题:Python: most idiomatic way to convert None to empty string?

【讨论】:

  • 如果您需要使用 True、False 和 None 的三值逻辑的完整实现,请查看Python Tribool module
  • 扩展@GrantJ 的声明,or_statement() 写的不是一个好的三态示例,因为它根据参数顺序有不同的结果:or_statement(None, False) 应该是不可判定的,即@987654345 @ 但返回 False,因为 or 是一个简单的快捷运算符,在将 None 的布尔强制转换为 False 之后会失败。
【解决方案2】:

基本上,因为空字符串不是None 的表示。 None 是一个与空字符串或其他任何内容不同的特殊值。如the docs 中所述,str 应该是

返回一个字符串,其中包含一个对象的可打印表示。

基本上,str 应该返回可打印和人类可读的内容。空字符串不是None 的可读表示。

【讨论】:

  • 按照这个逻辑,str(None)str('None') 也不应该相等。
  • @Mark 这表明str 应该与平等有关吗?它只是一个可以打印的值。如果需要将类型/值区分为字符串,请使用repr
  • @DanielB,我已经在对问题本身的评论中表达了这种情绪。
猜你喜欢
  • 2019-05-08
  • 2020-10-17
  • 2011-10-19
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 2011-11-10
相关资源
最近更新 更多