好冷的Python–占位符pass和它的备胎们

原文链接:http://www.juzicode.com/archives/659

先看一段代码,这个代码里定义了一个func()函数,但是函数体内部没有任何语句,结果解释器在解析到”def func():”后面时,提示IndentationError异常:

def func():

if __name__ == '__main__':
    func()

==========结果:
  File "E:\juzicode\test.py", line 5
    if __name__ == '__main__':
     ^
IndentationError: expected an indented block

在条件、循环语句的下级缩进中,有时具体业务并不是需要马上实现;或者定义函数时,先只是取了一个函数名称,函数内部还没有想好怎么实现,这个时候就可以使用pass语句先占着位置,避免程序执行的时候抛异常。

if a==10:
    pass

def func():
    pass

常见的用法是在下一层缩进中使用pass语句进行”占位”,除了用pass语句还可以使用”…”来代替:

def func():
    ...

你可能会有疑问,”…”是个什么东东?先上type()函数检查类型试试:

>>>type(...)
<class 'ellipsis'>

原来 ”…” 是一种叫做ellipsis的class,在Python中一切皆对象,既然可以用一种ellipsis类的实例来占位,是不是也可以用一个其他类的实例呢?

def func():
    ()

def func():
    []

def func():
    3.14

def func():
    'todo'

def func():
    0

def func():
    None

用上面这些函数代替最前面例子中的func()函数,运行都没有问题,所以用int,str,list等数据类型做占位语句也都是可行的。

下面的例子则是用自定义class的一个实例作为占位语句也没有问题。

class  ABC():
    def __init__(self):
        self.a=10

def func():
    ABC()

if __name__ == '__main__':
    func()
结论:
1.通常使用“pass”作为占位语句;
2.也可以使用“...”作为占位语句;
3.任何内置或自定义类的实例也可以作为占位语句。

下面这段代码摘自Python内置operator模块的源码(安装路径根目录下的”lib\operator.py”文件),这些函数每个return语句前面都有一段“悬挂”的字符串,你还会觉得惊讶吗?

# Comparison Operations *******************************************************#

def lt(a, b):
    "Same as a < b."
    return a < b

def le(a, b):
    "Same as a <= b."
    return a <= b

def eq(a, b):
    "Same as a == b."
    return a == b

def ne(a, b):
    "Same as a != b."
    return a != b

def ge(a, b):
    "Same as a >= b."
    return a >= b

def gt(a, b):
    "Same as a > b."
    return a > b

我们在写注释的时候,可以用一对 ”’ ”'(三个引号)将注释内容包含起来,比如在函数定义的下一行写三引号注释必须要缩进,就像下面这个例子,聪明的你知道下面这2段代码为什么前者正确,后者会报IndentationError错误了吗?


>>> def func():
...     '''todo'''
...
>>> 

>>> def func():
... '''todo'''
  File "<stdin>", line 2
    '''todo'''
    ^
IndentationError: expected an indented block

推荐阅读: 
好冷的Python–tuple和逗号的恩怨情仇
好冷的Python–三引号注释,你的要求为什么这么多!
好冷的Python–源文件编码
好冷的Python–pass和它的备胎们

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注