2010-01-09 4 views
3

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

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 импортируют частично), если я не могу прочитать код C?

+0

Реализация 'functools' находится в C для 2.5 и 2.6. Если вы хотите увидеть источник, вы будете * иметь * для чтения C. Кажется, что разница в том, как он скомпилирован на моем дистрибутиве, но в любом случае, источник находится в 'C'. Посмотрите ссылки на репо в своем ответе, если вы хотите увидеть источник. –

+3

zjm: Не используйте непубличные ('_ *') модули напрямую и просмотрите документацию для functools.partial по адресу http://docs.python.org/library/functools.html#functools.partial. – 2010-01-09 07:38:59

+0

+1 для не использования (полу) частных модулей с префиксом '_'. –

ответ

3

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

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

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

В частности, это 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

спасибо, alex, вы классный человек. – zjm1126

0

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

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

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

0

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

Если вы хотите, чтобы увидеть источник 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

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

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