_functools模块

4
这个导入功能是如何工作的,它使用哪个文件?
import _functools

在Python 2.5版本中:

import _functools
print _functools.__file__

提供:

Traceback (most recent call last):
  File "D:\zjm_code\mysite\zjmbooks\a.py", line 5, in <module>
    print _functools.__file__
AttributeError: 'module' object has no attribute '__file__'

如果我不懂C语言代码,怎么获取partial(从_functools导入的)的含义?


functools 的实现在 2.5 和 2.6 版本中是用 C 编写的。如果你想查看源代码,就必须阅读 C 语言。在我的发行版上编译方式似乎有所不同,但无论如何,源代码都是用 C 编写的。如果你想查看源代码,请查看我的回答中的仓库链接。 - Noufal Ibrahim
3
不要直接使用非公共 (_*) 模块,查看 functools.partial 的文档请访问 http://docs.python.org/library/functools.html#functools.partial。 - Roger Pate
+1 是为了不使用以 _ 为前缀的(半)私有模块。 - Noufal Ibrahim
感谢 Noufal Ibrahim 和 Roger Pate。 - zjm1126
这虽然很老,但有时我喜欢使用私有函数、方法等,特别是在 asyncio 中,因为有很多 API,比如 loop._write_to_self,可以在原本不支持线程安全的方法中实现线程安全。或者为了“走捷径”,直接运行一个更接近实现的函数,而不是通过公共版本运行,例如 asyncio.tasks_wait 而非 asyncio.wait。这只是微不足道的优化,但只要我知道,并且不会导致代码库看起来荒谬无比,我就喜欢进行优化。但这是主观的,因为有些人反对使用私有方法。 - Break
5个回答

3

C编写的模块可以内置(缺少__file__)或位于.so.pyd动态库中(它们的__file__将指示)--这是您不必关心的实现细节。

如果您想通过研究代码来了解Python可调用的C编写函数的工作原理,学习阅读C通常是最好的选择(比实际在C中进行编码要容易得多;-)。然而,通常您会发现(启示性的、非权威的)“C编写的功能示例Python实现”,您可以研究那些。

一种特别有成果的Python编写的等价于通常以C编写的Python标准库功能的存储库是pypy项目(它使用Python进行编写)--其源代码可以在此处浏览,当然您也可以下载并在您的计算机上查看它们。

特别地,这是pypy的_functools.py实现:
""" Supplies the internal functions for functools.py in the standard library """

class partial:
    """
    partial(func, *args, **keywords) - new function with partial application
    of the given arguments and keywords.
    """
    __slots__ = ['func', 'args', 'keywords']

    def __init__(self, func, *args, **keywords):
        if not callable(func):
            raise TypeError("the first argument must be callable")
        self.func = func
        self.args = args
        self.keywords = keywords

    def __call__(self, *fargs, **fkeywords):
        newkeywords = self.keywords.copy()
        newkeywords.update(fkeywords)
        return self.func(*(self.args + fargs), **newkeywords)

相当容易阅读和理解,希望如此!

1

对于Python2.6,_functools模块是内置的。您可以在解释器提示符下键入import _functools; repr(_functools)并按回车键,即可看到。

如果您想查看该模块的C源代码,请查看http://hg.python.org/cpython/file/d7e85ddb1336/Modules/_functoolsmodule.c

由于它被编译进解释器中,因此此_functools模块没有__file__属性(请参见下一段)。

对于Python2.5, _functools模块是一个用C实现的标准库模块,如果您想查看它,可以在http://hg.python.org/cpython/file/a78381ead4cf/Modules/_functoolsmodule.c找到。您可以通过在解释器提示符下键入import _functools ; print _functools.__file__来查看加载模块的位置。

0

下次提问时请更清楚明确。我假设你想要这个。

>>> import _functools
>>> _functools.__file__
'/usr/lib/python2.6/lib-dynload/_functools.so'

0

这是一个共享对象_functools.so,用C语言编写。我猜它被实际的functools模块导入。你为什么要尝试从中导入呢?当然,这是可能的,但是你同样可以使用from functools import partial


0

functools.partial() 函数的行为在 PEP 309 中有所描述。虽然内置函数的实际实现通常是用 C 编写的,但包括这个函数在内的 PEP 通常会包含 Python 的示例实现

这个示例代码应该足以让您理解 functools.partial() 的行为。如果您对 C 实现的特定问题有疑问,您需要阅读 C 代码。或者在您的问题中描述它,也许有人会知道答案。


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