модуль _functools - PullRequest
       49

модуль _functools

4 голосов
/ 09 января 2010

Как работает этот импорт, какой файл он использует?

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__'

Как я могу получить значение частичного (из _functools import частичного), если я не могу прочитать код C?

Ответы [ 5 ]

3 голосов
/ 09 января 2010

C-кодированные модули могут быть встроенными (без __file__) или размещаться в динамической библиотеке .so или .pyd (которую будет указывать их __file__) - это деталь реализации, которую вы не должны заботиться о.

Если вы хотите понять, как Python-вызываемая, C-кодированная функция работает, изучая код, лучше научиться читать C (гораздо менее сложный, чем на самом деле продуктивно кодирование в C ;-). Тем не менее, часто вы найдете (наводящие на размышления, не авторитетные) «примеры реализаций Python» с функциональностью на C-коде, и вы можете изучить эти .

Особенно плодотворным хранилищем кодированных Python эквивалентов функциональности стандартной библиотеки Python, который обычно кодируется в C, является проект pypy (в котором реализованы реализации Python, написанные на 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)

Довольно тривиально читать и понимать, надеюсь!

0 голосов
/ 09 января 2010

Поведение функции functools.partial() описано в PEP 309 , в котором она была определена. Хотя фактические реализации встроенных программ часто присутствуют в C PEP, включая эту, они обычно содержат примеров реализаций в Python

Этот пример кода должен быть достаточным, чтобы вы могли понять поведение functools.partial(). Если есть конкретная проблема в реализации C, которая касается вас, вам придется прочитать код на C. Или, возможно, опишите это в своем вопросе, и кто-то может знать ответ.

0 голосов
/ 09 января 2010

Это общий объект _functools.so, написанный на C. Я думаю, он импортируется фактическим модулем functools. Почему вы пытаетесь импортировать из него? Конечно, это возможно, но вы также можете from functools import partial.

0 голосов
/ 09 января 2010

для 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 голосов
/ 09 января 2010

пожалуйста, будьте более ясны, задавая вопросы в следующий раз. Я полагаю, вы хотите это

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