函数或类的存根化

12

你能解释一下来自这篇文章的概念stubbing out functions or classes吗?

class Loaf:
    pass  

这个类没有定义任何方法或属性,但语法上需要在定义中添加一些内容,因此你可以使用pass。这是Python中的保留字,意思是“走开,这里没有什么可看的”。它是一个不执行任何操作的语句,在模拟函数或类时是一个好的占位符。

谢谢

6个回答

28

桩函数或桩类

这指的是编写类或函数但尚未实现它们。例如,我可能创建一个类:

class Foo(object):
     def bar(self):
         pass

     def tank(self):
         pass

我已经编写了函数的桩代码,因为我还没有实现它们。但是,我认为这不是一个好的计划。相反,你应该这样做:

class Foo(object):
     def bar(self):
         raise NotImplementedError

     def tank(self):
         raise NotImplementedError
那样,如果你在它被实现之前意外地调用了该方法,你会收到一个错误而不是什么都不发生。

1
那么,存根只是提醒我需要实现某些东西的吗? - xralf
1
@xralf 不总是这样。有时您需要一个无操作函数,而声明空块的唯一方法是使用pass(类似于诸如“C ++”之类的语言中的空花括号)。 - awesomo
@awesomo,你认为那是一个存根吗?我认为存根是不完整的,而故意的无操作并不是不完整的。 - Winston Ewert
@WinstonEwert 我同意。我的评论更多是为了解决OP对"pass"关键字的理解似乎存在欠缺的问题(或者这是从问题中看出来的)。 - awesomo
@awesomo,根据我的理解,这个问题只是关于存根(stubbing)的含义,而这个概念在pass的上下文中得到了体现。我没有看到任何不理解pass的证据。 - Winston Ewert
显示剩余3条评论

8
一个“stub”是一个占位符类或函数,它目前还没有实现任何功能,但需要存在以便定义相关的类或函数。这个想法是,即使你还没有编写实现,你已经可以使用它的某些方面(例如将其放入集合中或作为回调传递)。
存根技术在许多情况下都很有用,包括:
- 团队开发:通常,首席程序员会提供填充了方法存根和描述方法应该执行什么操作的注释的类模板,留下实际的实现工作给其他团队成员。 - 迭代式开发:存根允许从部分实现开始;代码尚未完成,但它仍然可以编译。细节在后续迭代过程中填充。 - 演示目的:如果方法或类的内容对演示目的不重要,则通常会省略内容,只留下存根。

1
你的回答也被接受了,这使得它更完整、更有趣。 - xralf

7
请注意,您可以这样填充函数:
```javascript ```
def get_name(self) -> str : ...
def get_age(self) -> int : ...

(是的,这是有效的Python代码!)

对于由第三方库动态添加到对象中的函数,并且您希望具有类型提示,存根函数可能非常有用。我也遇到过这种情况...一次 :-)


6

在IT技术领域,使用省略号...来作为存根比使用pass更好。

pass表示“什么都不做”,而...表示“这里应该有些内容”——它是未来代码的占位符。其实现效果相同,但意义不同。


1

存根是软件开发中的一种技术。例如,当您规划了一个模块或类,比如绘制它的UML图后,就开始实现它。

由于您可能需要实现许多方法和类,因此您可以从存根开始。这意味着您只编写函数的定义,并将实际代码留待以后再写。优点是您不会忘记方法,并且可以在看到代码的同时继续思考设计。


0

pass 的原因是 Python 是缩进依赖的,并期望在冒号之后有一个或多个缩进语句(例如在classfunction之后)。

当您没有语句时(例如在存根函数或类的情况下),仍需要至少一个缩进语句,因此您可以使用特殊的pass语句作为占位符。您也可以用没有效果的东西来代替:

class Loaf:
    True

这样也可以(但在我的看法中,使用 pass 比这种方法不够清晰)。


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