2010-05-26 4 views
7

저는 쉘과 같은 환경을 만들고 있습니다. 사용자 입력을 처리하는 본래의 방법은 함수가 파이썬의 최상위 클래스 객체라는 사실을 이용하여 다양한 클래스의 메소드에 명령 (문자열)을 매핑하는 사전을 사용하는 것이 었습니다.python의 getattr을 광범위하게 사용하는 것은 나쁜 습관입니까?

유연성을 위해서 (주로 명령을 구문 분석하기 위해) getattr (명령)을 사용하여 필요한 설정을 가져온 다음 내 인수를 내 끝에 전달하는 것과 같이 설정을 변경하려고합니다. 파서. 이 방법의 또 다른 장점은 새 메소드/명령을 추가 할 때마다 내 (현재 정적으로 구현 된) 명령 사전을 업데이트 할 필요가 없다는 것입니다.

제 질문은 두 가지입니다. 첫째, getattr은 eval과 동일한 문제가 있습니까? 둘째, 나는 내 껍질의 효율성에 타격을 가할 것인가? 얼마나 많은 메소드/명령어가 중요한가? 나는 현재 30 개의 명령을보고 있는데, 결국 두 배가 될 수 있습니다.

+1

경우 당신은 pyparsing http://pyparsing.wikispaces.com/을 보지 않았습니다. 정말로해야합니다. __NO__ 파이썬에 자신의 파서를 작성하는 진정한 이유가 있습니다. –

+2

퍼지, 나는 내가 하나를 생각할 수 있다고 확신한다. 그리고 나는 그것을 위해 무엇을하고 있는가 : 학습 목적. 이 현재 프로젝트를 시작하기 전에 함수의 첫 번째 클래스 객체라는 의미를 이해하지 못했습니다. 나는 참고를 그러나 평가한다. 나는 그것을 들여다 볼 것이다. – Wilduck

답변

20

직접 속성 액세스와 getattr() 사용의 차이는 무시해도 좋습니다. 당신은 두 가지 방법을 비교하는 파이썬의 dis 모듈을 사용하여 두 가지 버전의 '바이트 코드의 차이를 알 수 있습니다 :

>>> import dis 
>>> dis.dis(lambda x: x.foo) 
    1   0 LOAD_FAST    0 (x) 
       3 LOAD_ATTR    0 (foo) 
       6 RETURN_VALUE   
>>> dis.dis(lambda x: getattr(x, 'foo')) 
    1   0 LOAD_GLOBAL    0 (getattr) 
       3 LOAD_FAST    0 (x) 
       6 LOAD_CONST    0 ('foo') 
       9 CALL_FUNCTION   2 
      12 RETURN_VALUE 

어떻게 파이썬 라이브러리와 매우 유사하다 쉘을 개발하는 것은, 그러나, 소리 않습니다 cmd 명령 줄 셸을 사용합니다. cmd은 당신이 그렇게 같은 cmd.Cmd 객체에 정의 된 함수에 명령 이름을 일치시켜 명령을 실행 쉘 만들 수 있습니다 :

import cmd 

class EchoCmd(cmd.Cmd): 
    """Simple command processor example.""" 

    def do_echo(self, line): 
     print line 

    def do_EOF(self, line): 
     return True 

if __name__ == '__main__': 
    EchoCmd().cmdloop() 

당신은 문서를 하나의 모듈에 대한 자세한 내용을, 또는 수 http://www.doughellmann.com/PyMOTW/cmd/index.html

+1

+1 "확인 표시". – EOL

+0

이 응답을 보내 주셔서 감사합니다. 위의 내 코멘트에서와 같이, 나는 실제로이 셸을 학습 목적으로 작성하고 있습니다. 장래에, 실제로 생산 목적으로 쉘을 작성해야한다면 cmd를 사용할 것입니다. 나는 dis에 대해 알지 못했다. 참고를위한 감사. – Wilduck

6

getattr에는 eval과 동일한 문제가 있습니까?

아니요 - eval()을 (를) 사용하는 코드가 심각하게 보안상의 문제가있을 수 있습니다. getattr(x, "foo")을 호출하면 x.foo을 작성할 수 있습니다.

나는 내 껍질

눈에 보이지 명령이 발견되지 않는 경우는 느리지 만 상관하는 것만으로는 충분하지됩니다의 효율성에 타격을 복용한다. 수만 개의 항목이있는 벤치 마크를 수행하는 경우에만이를 알 수 있습니다.

관련 문제