2017-10-19 11 views
1

다양한 가져온 파일에서 호출해야하는 여러 가지 기능이 있습니다.문자열을 객체로 전달하여 getattr python에 전달하는 방법

기능이의 라인을 따라 형식의됩니다

a.foo 
b.foo2 
a.bar.foo4 
a.c.d.foo5 

그들은 원시 문자열로 내 스크립트에 전달됩니다. 내가 수익을 인수 다음을 실행하고 얻을 수있는 깨끗한 방법을 찾고 있어요

내가 전화 getattr 오른쪽을 공급 한 후 문자열을 분할의 지저분한 시스템을 가지고 있지만이 느끼는 지금

값 서투른 일종이며 매우 확장 성이 없습니다. getattr의 객체 부분을 문자열로 전달할 수있는 방법이 있습니까? 아니면이 일을하는 다른 방법?

import a, b, a.bar, a.c.d 

if "." in raw_script: 
    split_script = raw_script.split(".") 
    if 'a' in raw_script: 
     if 'a.bar' in raw_script: 
      out = getattr(a.bar, split_script[-1])(args) 
     if 'a.c.d' in raw_script: 
      out = getattr(a.c.d, split_script[-1])(args) 
     else: 
      out = getattr(a, split_script[-1])(args) 
    elif 'b' in raw_script: 
     out = getattr(b, split_script[-1])(args) 

답변

1

이 시도 :이 아니라 당신의 ab 수입 모듈, 전역 이름으로 시작하는 경로를 처리 할

def lookup(path): 
    obj = globals() 
    for element in path.split('.'): 
     try: 
      obj = obj[element] 
     except KeyError: 
      obj = getattr(obj, element) 
    return obj 

하는 것으로. 함수에 신뢰할 수없는 입력이있을 수 있다는 우려가 생기면 전역 변수 전체가 아니라 허용되는 시작점을 포함하는 사전으로 시작해야합니다.

1

귀하의 질문에서 말하기는 어렵지만, 사용자가 실행하는 명령 줄 도구가 my-tool <function> [options] 인 것 같습니다. 이렇게 getattr 전화를 피하면 importlib을 사용할 수 있습니다.

import importlib 

def run_function(name, args): 
    module, function = name.rsplit('.', 1) 
    module = importlib.import_module(module) 
    function = getattr(module, function) 
    function(*args) 

if __name__ == '__main__': 
    # Elided: retrieve function name and args from command line 
    run_function(name, args)