Python的empty函数不需要使用pass语句吗?

9
我偶然发现了 Python 的一个有趣且意外的特性:
def fun():
    """Foo’s docstring"""

这是一个有效的函数吗?根据PEP 257,“文档字符串是模块、函数、类或方法定义中出现的第一条语句的字符串字面值”,这意味着文档字符串本身被视为一条语句?
我原本期望至少需要一个pass语句。上述示例违反了Python之禅“显式优于隐式”的原则,因为pass表示明确意图,而文档字符串则没有。
有人能解释一下意图吗?

9
有什么不清楚的吗?正如这句话所说,字符串是第一个语句,根据语法规则,只要有一个语句就足以使函数在语法上有效。换句话说,这并不是一个空函数。 - jonrsharpe
1
“Intent”指的是什么? - pvg
9
Python之禅没有告诉你关于语法的事情。如果你认为在docstring后面添加一个'pass'语句可以更清晰地表达代码的意图,那么你可以加上,但这并不是运行代码所必需的。要求'suite'至少包含一条语句只会使解析器变得复杂,除非它在'funcdef'中且第一条语句是字符串字面值,在这种情况下,它必须包含至少两个语句。*"简洁胜于繁琐。"* - jonrsharpe
是的,Python解析器确实允许您做一些违反Python之禅的事情,但那又怎样呢?您具体有什么问题? - jwodder
2
“当放置在特定位置时被视为语句”是什么意思?一个独立的字符串字面值是一个表达式,因此是一个表达式语句。事实上,当这样的语句是函数/类/模块/方法中的第一个语句时,它也被特殊处理为文档字符串,但这并不改变它的本质。 - jonrsharpe
显示剩余2条评论
1个回答

12

字符串字面值与其他字面值类似。如果您只输入整数,它也可以工作:

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)

因此,如果一个函数的唯一内容是字符串文字,那么它实际上被"解析"和"编译"的方式不会改变。除了它也有一个非None的__doc__属性。

这对于abstractmethod非常方便(例如,在"Python中的抽象方法体"中),在那里你不需要实际的函数体。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接