2016-12-08 1 views
1

파이썬을 사용하여 파이썬 파일의 클래스 목록을 얻으려고합니다. 몇 가지 검색 후, 나는파이썬 파일의 클래스 목록 얻기

def get_class_from_file(class_obj, file, path='app', exclude=[]): 
    class_list = [] 
    module = importlib.import_module(path + '.' + file) 
    for x in dir(module) : 
     app_cls = getattr(importlib.import_module(path + '.' + file), x) 
     try : 
      if app_cls and issubclass(app_cls, class_obj) and app_cls != class_obj and app_cls not in exclude: 
       class_list.append((file, x)) 
     except TypeError : 
      pass 
    return class_list 

그러나, 나는 코드가 클래스의 목록을 가져하지 않는 것이 발견에 따라 같이 일 생각 코드를 얻을 수 있지만, 아직 나에게 슈퍼 클래스를 보여주는 유지 파일 내부의 클래스로, 여기에 예를

file_1.py

class A: 
    pass 

class B(A): 
    pass 

file_2.py

class C(B): 
    pass 

class D: 
    pass 
입니다

I은 ​​함수를 호출 할 때 class_list = get_class_from_file (A는 'file_2') I는 결과가 [C]가 될 것이지만, 반환 기대

[C를, B] B로 C

슈퍼 클래스 중 하나 인

이 문제를 해결할 수 있도록 도와주세요. 클래스의 최상위 클래스가 아닌 지정된 파일 내부에 클래스가 있어야합니다. 그건 그렇고, 나는 그것을 처음에 고치기 위해 제외를 사용하지만, 그것은 나에게 장기간의 해결책을주지 않는다.

+1

file_2.py에는 'from file_1 import A'가 (가) 있습니다. 그리고 그 다음부터는 A가 file_1과 file_2에 있음을 의미합니다. – RemcoGerlich

+0

@RemcoGerlich 답변이 맞습니다. 저는이 작업이 당신이 생각하는 것처럼 사소한 것은 아니라고 덧붙이고 싶습니다. 'class A : pass'와'B = A'가 있다면 어떨까요? 이 파일에는 두 개의 클래스 또는 하나의 클래스가 있습니까? 클래스 목록에는 속는자가 포함되어 있습니다. 어쩌면 그게 당신이 원하는 것일 수도 있습니다. –

+0

@ ŁukaszRogalski : 그렇습니다. 이미 발견 된 id()를 유지하는 것과 같은 일을하더라도 가장 먼저 A 또는 B를 찾지 못합니다. 하지만 그의 유스 케이스는 그런 문제가 없다는 것입니다. – RemcoGerlich

답변

2

가져온 모듈도 있습니다. 클래스 ' __module__ 속성을 검사하여 현재 모듈에서 가져 왔는지 또는 가져 왔는지 확인할 수 있습니다.

두 번 importlib.import_module(path + '.' + file) 두 번 제거했는데 그 중 하나를 제거했습니다. 나는 xname으로 개명했다.

def get_class_from_file(class_obj, file, path='app', exclude=[]): 
    class_list = [] 
    module_path = path + '.' + file 
    module = importlib.import_module(module_path) 
    for name in dir(module) : 
     app_cls = getattr(module, name) 
     try: 
      if (issubclass(app_cls, class_obj) and 
       app_cls != class_obj and 
       app_cls not in exclude and 
       app_cls.__module__ == module_path): 
      class_list.append((file, name)) 
     except TypeError: 
      # Not a class 
      pass 
    return class_list 
+0

고마워, 그게 다야. – Chetchaiyan