Вопрос
Как работает этот импорт, какой файл он использует?
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.Или, возможно, опишите это в своем вопросе, и кто-то может знать ответ.