Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

Для Python2.6, В _functools модуль является встроенным.Вы можете увидеть это, если просто наберете import _functools ; repr(_functools) и нажмите enter в командной строке вашего переводчика.

Если вы хотите увидеть исходный код модуля на языке Си, ознакомьтесь с http://hg.python.org/cpython/file/d7e85ddb1336/Modules/_functoolsmodule.c

Это _functools модуль не имеет __file__ атрибут (см. Следующий абзац), поскольку он скомпилирован в интерпретатор.

Для Python2.5, В _functools module - это стандартный библиотечный модуль, реализованный на C и доступный по адресу http://hg.python.org/cpython/file/a78381ead4cf/Modules/_functoolsmodule.c если ты хочешь это увидеть.Вы можете увидеть местоположение, из которого загружается модуль, набрав import _functools ; print _functools.__file__ по подсказке вашего переводчика

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top