2009-07-09 2 views
20

좋아요. dir() 메서드를 사용하여 모듈의 모든 것을 나열 할 수 있지만 해당 모듈에 정의 된 함수 만 볼 수있는 방법이 있습니까? 예를 들어, 내 모듈은 다음과 같습니다 가정모듈에 명시 적으로 정의 된 함수 찾기 (파이썬)

from datetime import date, datetime 

def test(): 
    return "This is a real method" 

을 내가 내장 명령을 필터링() 검사를 사용하더라도, 나는 여전히 가져온 아무것도 남아 있어요. 예컨대 내가 볼 수 있습니다 :

[ '날짜', '날짜', '테스트']

가 수입을 제외 할 수있는 방법이 있나요? 또는 모듈에서 정의 된 것을 찾아내는 또 다른 방법은 무엇입니까?

+1

소스를 읽는 중 무엇이 잘못 되었나요? –

+0

파이썬에서 "method"는 일반적으로 클래스의 속성 인 함수를 나타 내기 위해서만 사용됩니다. 'test()'는 "함수"라고 더 잘 부릅니다. – Miles

답변

25

이와 비슷한 제품을 찾고 계십니까?

import sys, inspect 

def is_mod_function(mod, func): 
    return inspect.isfunction(func) and inspect.getmodule(func) == mod 

def list_functions(mod): 
    return [func.__name__ for func in mod.__dict__.itervalues() 
      if is_mod_function(mod, func)] 


print 'functions in current module:\n', list_functions(sys.modules[__name__]) 
print 'functions in inspect module:\n', list_functions(inspect) 

편집 : 'FUNC'에서 '메타'에서 변경 변수 이름 (우리는 여기에, 기능이 아닌 방법을 다루고있는) 혼란을 방지 할 수 있습니다.

+0

아쉽게도 데코 레이팅 된 함수에서는 작동하지 않습니다. –

+0

@ars inspect.isfunction (f [1])]'이라면 함수를 inspect.getmembers (mod)에서'[f [1] f '로 바꿀 수없고 같은 결과를 얻을 수 없습니까? – mVChr

+0

Nevermind는 가져온 함수를 포함 할 수 있지만 여전히 작동하려면'getmodule (func) == mod'가 필요하지만 여전히 one-ish 라이너입니다. – mVChr

1

파이썬의 모든 클래스에는 __module__ 속성이 있습니다. 해당 값을 사용하여 필터링을 수행 할 수 있습니다. 좀 봐 example 6.14 in dive into python

+0

하지만 이것은 클래스가 아니며 모듈에 정의 된 일부 메소드 일뿐입니다 ... – Cory

+0

함수에도 '__module__' 속성이 있습니다. – Miles

0

파이썬 inspect 모듈이 아마도 여기에서 찾고있는 모듈 일 것입니다. 다음에 대한

import inspect 
if inspect.ismethod(methodInQuestion): 
    pass # It's a method 
+1

나는 이것을 시도했다. 검사는 여전히 수입 된 방법을 반환한다. – Cory

+0

Stefano의 대답과 함께 작동하는 것처럼 보인다. 방법과 가져온 것이 무엇인지 볼 수 있습니다. –

+1

내 담당자가 50 세 미만이므로이 게시물에 댓글을 달았습니다. 함수에도 __module__ 속성이 있습니다. –

4

방법 :

grep ^def my_module.py 
+0

하하, 더 좋은 방법이 있어야합니다. 그렇죠? – Cory

+0

효과가있는 빠르고 더러운 솔루션입니다. 그것은 당신의 문제에 대한 최선의 해결책이 아닐지도 모르지만 당신이 해결하고자하는 문제를 모르기 때문에 나는 알지 못할 것입니다. –

+0

+1 : 소스를 읽는 것만으로. –

2

확인해 볼 수 있습니다 __module__ 해당 기능의 속성. 메소드가 보통 클래스에 속하기 때문에 "function"이라고 말합니다. ;-).

실제로, 클래스에는 실제로 __module__ 속성이 있습니다.