【问题标题】:Is it conventional to say that functions are called and methods are invoked?说调用函数和调用方法是惯例吗?
【发布时间】:2016-11-10 13:31:35
【问题描述】:

我正在阅读 Think Python: How to Think Like a Computer Scientist。作者将“invoke”用于方法,“call”用于函数。

这是一个约定吗?如果是这样,为什么要做出这种区分?为什么说函数被调用,而方法被说调用

【问题讨论】:

  • 相关,可能重复(在 C# 上下文中):What's the difference between “call” and “invoke”?
  • 根据我使用 Python 的经验,我会说对方法和函数都说/听到“调用”更为常见,而我很少听到用于任何一个的“调用”。但是,我在 Python 方面的培训是相当非正式的,您可能在不同领域有不同的约定。
  • 我一直区分总是调用一阶函数。 在类上调用类的方法
  • @cricket_007 很有趣。还记得你是如何接受那个约定的吗?我想知道这是否来自您学习的人/资源、学习其他语言的习惯等。
  • @elethan 主要是我的语言偏好。不确定我是否真的特别在任何地方捡到了。在函数式编程中,它确实是可以互换的。随便说一个,可能大多数人都能理解。

标签: python function python-3.x oop methods


【解决方案1】:

不是真的,也许新读者更容易做出明确的区分,以便理解他们的调用略有不同。至少这就是为什么我怀疑作者可能为每个人选择了不同的措辞。

在 Python 语言的参考手册中似乎没有规定这一点的约定。我似乎在做的是选择 invoke 当对函数的调用是 implicit 而不是显式的。

例如,在 the Standard Type Hierarchy 的 Callables 部分中,您会看到:

[..] 当实例方法对象被调用时,底层函数(__func__)被调用,在参数列表前面插入类实例(__self__)。 [...]

(强调我的)显式调用

再往下看Basic Customization,特别是for __new__,你可以看到:

调用创建类cls. __new__()的新实例是一个静态方法[...]

(强调我的)显式调用

几句话之后,您将看到 invoked 是如何使用的,因为__new__ 隐式调用__init__

如果__new__() 没有返回cls 的实例,则不会调用新实例的__init__() 方法

(强调我的)隐式调用

所以不,似乎没有使用任何约定,至少该语言的创建者是这样。简单胜于复杂,我猜 :-)。

【讨论】:

  • 我应该补充一点,在 Python 中,每个调用(可能除了内置数据类型)都包含属性查找,因此在实现级别上什至没有区别。
【解决方案2】:

the Python documentation 是一个很好的来源。对 Classes 部分进行简单的文本搜索,可以发现单词 "call" 多次用于引用“calling methods”,而单词 "invoke" 仅被使用一次。

根据我的经验,情况也是如此:我经常听到指代方法和函数时使用的“调​​用”,而我很少听到其中任何一个的“调用”。但是,我认为这主要是个人偏好和/或背景问题(设置是非正式的吗?学术性的?等等)。

您还将看到places in the documentation 使用“invoke”一词来引用函数:

void Py_FatalError(const char *message)

打印致命错误消息 并杀死进程。不执行清理。 这个功能应该 仅在检测到可以实现该条件的条件时调用 继续使用 Python 解释器很危险;例如,当 对象管理似乎已损坏。在 Unix 上,标准 C 库函数 abort() 被调用,它将尝试产生一个 核心文件。

来自here

void Py_DECREF(PyObject *o)

减少对象 o 的引用计数。对象不能为 NULL;如果您不确定它是否为 NULL, 使用 Py_XDECREF()。如果引用计数达到零,则对象的 类型的释放函数(不能为NULL)被调用

虽然这两个引用都来自 Python C API,但这可能很重要。

总结:

我认为在函数或方法的上下文中使用“invoke”或“call”是安全的,听起来不像菜鸟或炫耀。

请注意,我只谈论 Python,以及我从自己的经验中了解的内容。我无法说出这些术语在其他语言中的区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多