【问题标题】:Python’s empty function does not require a pass statement? [closed]Python的空函数不需要pass语句? [关闭]
【发布时间】:2018-02-19 03:00:32
【问题描述】:

我偶然发现了 Python 的一个有趣且意想不到的特性:

def fun():
    """Foo’s docstring"""

是一个有效的函数吗?根据PEP 257,“文档字符串是作为模块、函数、类或方法定义中的第一条语句出现的字符串文字”意味着文档字符串本身被视为语句? p>

我原以为这里至少需要一个pass 语句。上面的示例与“显式优于隐式”的Python Zen 相矛盾,因为pass 声明了明确的意图,而文档字符串则没有。

任何人都可以阐明其意图吗?

【问题讨论】:

  • 什么不清楚?正如那句话告诉你的那样,字符串是第一个语句,the grammar 只需要一个语句来使函数在语法上有效。换句话说,这不是一个空函数。
  • “意图”到底是什么意思?
  • 我已经扩展了这个问题...
  • Python之禅并没有告诉你语法。如果您认为 docstring 之后的 pass 语句使代码的意图更清晰,那么请务必添加一个,但运行代码不是 必需 的。要求suite 至少包含一个语句只会使解析器复杂化,除非它在funcdef 中并且第一个语句是字符串文字,在这种情况下它必须包含至少两个。 “简单胜于复杂。”
  • 你是什么意思“当放置在某个位置时考虑了一个声明”?字符串文字本身就是一个表达式,因此是一个表达式语句。当这样的语句是函数/类/模块/方法中的第一个语句时,它作为文档字符串的特殊情况并不会改变这一点。

标签: python python-3.x


【解决方案1】:

字符串文字就像任何其他文字一样。如果你只输入一个整数,它也可以工作:

def func():
    1

但是,如果你只使用评论,它就不起作用:

def func():
    # test

# IndentationError: expected an indented block

即使它也被添加为文档字符串(保存在__doc__ 属性中),它也是一个函数级常量:

def func():
    """I'm a function"""

>>> func.__code__.co_consts
("I'm a function", None)

因此,字符串文字仅作为函数内容的存在不会改变如何函数本身实际上是“解析”和“编译”的。好吧,除了它还有一个 not-None __doc__ 属性。

它实际上对abstractmethods 非常方便(参见例如"Body of abstract method in Python"),您不需要实际的函数体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2022-01-23
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 2017-06-09
    • 2010-09-30
    相关资源
    最近更新 更多