【问题标题】:When is a function in a standard library module called a built-in function?标准库模块中的函数何时称为内置函数?
【发布时间】:2018-09-20 06:01:42
【问题描述】:

我对术语“内置”函数感到困惑。我认为这仅意味着解释器中内置的那些功能并记录在 - 2. Built-in Functions
但似乎标准库模块中定义的函数也是内置函数(在某些情况下)。比如——

>>> import os
>>> os.chdir
<built-in function chdir>
>>> import warnings
>>> warnings.warn
<built-in function warn>
>>> import json
>>> json.dumps
<function dumps at 0x7f3643a240d0> # not built-in
>>> dir
<built-in function dir>
>>> 

那么,标准库模块中的函数什么时候称为内置函数,什么时候不是?

【问题讨论】:

  • 在我看来,内置函数是解释器的一部分,但与文档相反(“该库还包含内置函数和异常——所有 Python 都可以使用的对象无需导入语句的代码。”,docs.python.org/3/library/intro.html) 可以将它们放在库中

标签: python python-3.x python-internals


【解决方案1】:

这里的“内置”有两种含义,尽管它们都表示“解释器的一部分”。库引用使用它来指示没有import 的函数可用(它“不是模块的一部分”,尽管参见builtins)。解释器本身使用它来表示一个函数是本机实现的,而不是在 Python 中实现的(在 CPython 中,它至少名义上是 implemented in C)。

在 C 端还有另一个含义:如果 Python 二进制文件包含扩展模块(ie,用 C 编写的),那么它是内置的,而不是在需要时加载它。

【讨论】:

  • 你的意思是说C中有一个内置函数吗?但是,例如,warnings.warn 是 Python 中的内置函数。
  • @debashish: It's in C.
  • @user2357112:“它在 C 中”只有当它是 CPython 时。不要忘记还有其他实现(在 Java、dotnet 甚至 Python 本身中)。
  • 当我import warnings warnings.py 文件被加载。它有一个名为warn 的纯Python 函数。如何调用 C 函数而不是 Python 函数?
  • 好的,我知道了。 warnings.py 文件中有一个from _warnings import ...
【解决方案2】:

一个内置函数,根据the Reference manual 是:

内置函数

内置函数对象是 C 函数的包装器。内置函数的例子有len()math.sin()math 是一个标准的内置模块)。参数的数量和类型由 C 函数确定。特殊的只读属性:__doc__ 是函数的文档字符串,如果不可用,None__name__ 是函数名; __self__ 设置为无(但请参阅下一项); __module__ 是定义函数的模块的名称,如果不可用,则为 None。

这是指 CPython,其他实现,例如 Jython 将使用 Java 而不是 C 来实现它们的内置函数。


标准库的on Built-in functions 部分讨论的是始终可用的东西。这与Built-in constantsBuilt-in Types 一起构成了您可以随时访问的标识符的内置命名空间。

并非此内置命名空间中的所有内容都是内置函数或内置类型。值得注意的案例是那些在交互模式下使用的案例,例如 helpquit/exit

【讨论】:

    【解决方案3】:

    Luciano Ramalho 的书“Fluent Python”中,第一版第三版 2016-03-18,由 O'Reilly 出版,第 742 页上写道:

    术语 [i. e. “内置函数”]通常只指不需要导入的函数……但是像sys、math、re等内置模块也包含内置函数。

    总的来说,这个词的使用似乎不一致。但出于所有实际目的,这应该没有意义。”

    【讨论】:

      【解决方案4】:

      好吧,从这个定义来看,当一个函数说它是内置的时,它就是内置的;)

      更严肃地说:Python 是一种语言(我们称其为“法律”部分),CPython 是 Python 语言的一个(而非唯一)实现(我们称其为“技术”部分)。

      从合法的 POV 来看,语言定义指出,实现必须使某些函数(以及类和对象)在没有任何导入的情况下可用(IOW 有“内置”语言本身)。这就是 Python 文档定义为“内置”的内容。

      现在从技术 POV 来看,这不会阻止实现“技术上”内置一些其他函数/对象/类(因为它们在技术上是运行时的一部分)但作为 stdlib 模块之一的一部分公开或包裹。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-23
        • 1970-01-01
        • 2017-07-28
        • 2018-08-12
        • 2019-05-05
        相关资源
        最近更新 更多