2010-01-09 5 views
3

이 가져 오기는 어떻게 작동합니까? 어떤 파일을 사용합니까? 나는 C 코드를 읽을 수없는 경우_functools module

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에서 부분으로 가져올) 부분의 의미를 얻을 수 있습니다 : 파이썬 2.5에서

import _functools 

:

import _functools 
print _functools.__file__ 

준다?

+0

'functools'의 구현은 2.5와 2.6에서 C 언어로되어 있습니다. 소스를보고 싶다면, C를 * 읽어야한다. 배포판에 컴파일 된 방식에 차이가있는 것 같지만, 소스는'C'이다. 소스를보고 싶다면 내 대답에서 repo에 대한 링크를 확인하십시오. –

+3

zjm : 비공개 ('_ *') 모듈을 직접 사용하지 말고 http://docs.python.org/library/functools.html#functools.partial의 functools.partial 설명서를 참조하십시오. –

+0

+1 (')로 접두사가 붙은 (세미) 개인 모듈을 사용하지 않는 경우. –

답변

3

C 코드 모듈에 내장 (__file__ 결여) 또는 .so 또는 .pyd 동적 라이브러리 (자신의 __file__가 표시되는)에 살 수있다 - 그건 당신이 걱정하지 않도록 구현 세부입니다.

당신은 파이썬 호출, C 코드 기능이 에 학습 코드를 공부하여 작동 방법을 이해하려면

C는 일반적으로 실제로 생산적 ;-) C에서 코딩에 비해 최고 (훨씬 적은 어렵다 읽어 보시기 바랍니다. 그러나 종종 C 코드화 된 기능에 대한 (암시 적, 비판적인) "샘플 Python 구현"을 발견하게되며 을 공부할 수 있습니다.

일반적으로 C로 코딩 된 Python 표준 라이브러리 기능의 유용한 저장소는 pypy 프로젝트 (Python으로 구현 된 Python 구현)입니다. 해당 소스는 찾아 볼 수 있습니다. here 물론 다운로드 할 수 있습니다. 그들을 기계에서 정독하십시오.

""" 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) 

읽고 이해하기 아주 사소한, 나는 희망 : 특히

,이 pypy의 _functools.py 구현입니다!

+0

덕분에, 알렉스, 당신은 멋진 사람입니다. – zjm1126

0

다음에 질문 할 때 더 분명히하십시오. 나는 내가 그것을 실제 functools 모듈 가져 추측 C.로 작성된 공유 객체 _functools.so, 당신이

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

를 원하는 가정합니다. 왜 그걸 가져 오려고합니까? 물론 가능합니다. 다만 from functools import partial도 가능합니다.

0

Python2.6의 경우 _functools 모듈이 내장되어 있습니다. 단순히 import _functools ; repr(_functools)을 입력하고 인터프리터 프롬프트에서 enter를 누르면 알 수 있습니다. 이 모듈의 C 소스를보고 싶다면

,이 인터프리터로 컴파일 이후 (다음 단락 참조) __file__ 속성이없는 http://hg.python.org/cpython/file/d7e85ddb1336/Modules/_functoolsmodule.c

_functools 모듈을 확인하십시오.

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 코드를 읽어야합니다. 또는 귀하의 질문에 그것을 설명하고 누군가가 대답을 알 수 있습니다.