2017-05-02 15 views
3

나는 기능을 사용하는 경우? 이 기능과 다른 기능을 일반적으로 결정하는 편리한 방법이 있습니까?파이썬 모듈 카운터()는 C를 사용합니까?</p> <pre><code>from collections import Counter </code></pre> <p>가 카운터() 소스로 사용하여 C 구조 :

주어진 함수가 C 구조체를 사용하는지 확인하는 가장 좋은 방법은 파이썬이 일반적으로 소스 코드에서 무엇을 찾고 있어야하는지 알려주는 것입니다.

+1

직접 확인하십시오 : [Python source code] (https://github.com/python/cpython/blob/3.6/Lib/collections/__init__.py). 말하기에 가장 좋은 방법은 문서를 보는 것입니다. – tyteen4a03

+0

그것은 보입니다 : ( – Oliver

+0

찾을 소스 코드를 보는데 어려움을 겪고 있습니다 – Oliver

답변

2

클래스에 대해 이것을 선언 할 직접적인 방법은 없지만 함수 나 메소드가 C로 작성되었는지 확인하는 방법이 있습니다. 따라서 C로 작성된 모든 클래스는 C에서 적어도 하나의 명시 적 또는 암시 적 함수를 정의합니다 그것은 어려울 것) 당신은 inspect.isbuiltin 확인 할 수 있습니다

>>> import collections 
>>> import inspect 
>>> def is_c_class(cls): 
...  return any(inspect.isbuiltin(getattr(cls, methname, None)) 
...    for methname in cls.__dict__) 

>>> is_c_class(collections.Counter) 
False 

>>> is_c_class(dict) 
True 

을 그 아니다 그러나 모든 IT에 있기 때문에 C 함수입니다 collections.Counter 호출 collections._count_elements :

>>> inspect.isbuiltin(collections._count_elements) 
True 

그래서 당신은 항상 일을 확인해야합니다 전자 소스 코드 (Pythons repository is on github 및 또한 Counter 구현)을 확인하십시오.


위의 수표에는 isbuiltin을 사용하는 데 몇 가지 결함이 있습니다. 예를 들어 C 함수의 클래스 속성을 가질 수 있습니다.

>>> class Test(object): 
...  c_function = all # builtin all function is a C function 

>>> is_c_class(Test) 
True 

따라서 항상 올바른 결과를 제공하고 근사값으로 처리하지 마십시오.

+1

실제로 클래스의'__flags__'를 검사하여 C로 작성되었는지 확인합니다. C API를 통해 구현 된 클래스는 Py_TPFLAGS_HEAPTYPE을 설정하지 않지만 Py_TPFLAGS_HEAPTYPE의 값은 Python에서 노출되지 않습니다 (현재 1 << 9이지만, 안정적인지는 모르겠다.) – user2357112

+0

@ user2357112 좋은 점은 실제로 플래그를 보았고 그 값이 명시 적으로 주어지지 않았기 때문에 플래그를 보았습니다. – MSeifert