2013-05-20 2 views
1

필자는 Python (2.7)에서 쉽게 확장/모듈 식 명령 줄 응용 프로그램을 설계하려고합니다. 각 모듈을 "작업"이라고합니다. 파일 당 하나의 작업이 tasks/디렉토리에 포함되어 있으며 각각은 Task의 하위 클래스를 포함하고 run() 메서드는 주어진 작업에 대한 코드 진입 점을 포함합니다. 각 "작업 파일"에 작업을 시스템에 등록하는 데 필요한 모든 것이 포함되기를 원합니다. 각 작업에는 도움말, 사용 가능한 인수, 인증 정보, 범주 등과 같은 메타 데이터가 포함됩니다.이 정보는 단지 정적 속성이 아닙니다. 예를 들어 도움말 시스템에는 Template을 사용하여 도움말 텍스트에서 $variable을 대체합니다. 클래스 기반 "작업"모듈에 적합한 패턴?

class TestTask(Task): 
    description = "This task prints 'Hello world...' and exits." 
    help = "Usage: $argv0 $task ...\n ..." 

    def __init__(self, arguments=None): 
     super(TestTask, self).__init__(description=self.description, arguments=arguments, help=self.help) 

    def run(self): 
     print("Hello world...") 

그래서, 다음, 우리가 어떻게 작업에 대한 도움말을 표시 않습니다

여기에 몇 가지 예제 코드는? 또는 설명이있는 모든 작업 목록을 얻으시겠습니까? 디렉터리를 효율적으로 스캔하고 가져오고로드하고 각 작업을 인스턴스화하여 getHelp() 또는 getDescription()을 호출해야합니다. 이러한 작업 중 일부는 상당히 무겁습니다. "목록 작업"의 로딩 시간은 1 초 이상이며 눈에.니다. 캐싱을 생각했지만 잔인한 것처럼 보입니다.

더 간편하고 빠른 방법은 무엇인가요? 어떻게 든 작업 메타 데이터를 캐시해야합니까? 가능한 한 동적 인 작업으로 작업 개발을 쉽게하기를 바랍니다. 메타 데이터가 포함 된 내부 클래스에 대해 생각했지만 확실하지 않습니다. 모든 작업의 ​​import은 여전히 ​​처리되어야하며, "Meta"내부 클래스와 포함하는 Task 사이의 정보를 공유하는 적절한 방법에 대해 명확하지 않습니다. 파이썬에 다음과 같이 내가 뭔가를 놓치고 있는지 궁금해. 플러그인 모델을 어떻게 설계 했습니까? 감사!

+1

기존 대안, 특히 후크를 제공하는 웹 프레임 워크를 확인해보십시오. 구체적으로는 [argparse 모듈] (http://docs.python.org/2.7/library/argparse.html)을 사용하면 인수를 처리하고 유용한 도움말 기능을 제공 할 수 있습니다 (서브 파서를 작성하여 근사치로 만들 수도 있습니다) git과 같은 것). 심지어 형식화 된 출력을 얻을 수 있습니다. argparse가 정확히 당신의 패키지에서하는 일은 무엇입니까? –

+0

이미 ArgumentParser를 사용하고 있습니다. 또한 프레임 워크를 사용하지 않습니다. 이것이 프레임 워크입니다. 도움이된다면이 질문에 더 많은 정보를 제공 할 수 있습니다. 내 질문은 기본적으로 단지 performant있는 방식으로 메타 데이터를 캡슐화하는 방법에 관한 것입니다. 우리가 말하는 "도움말"은 실제로 "사용법"이 아닙니다. 특정 작업에 대한 도움말 페이지를 제공합니다. 요점은 작업 메타 데이터가 적어도 작업 클래스가있는 파일에 포함되어야한다는 것입니다. – Will

+1

죄송합니다. 다른 프레임 워크가 플러그인을 처리하는 방법을 확인할 수도 있습니다. 그러나 많은 것을 생각할 수는 없습니다. 너무 많은 플러그인을 처리하기 만하면 가져 오기가 어려울 것입니다. –

답변

2

나는 완전히 당신의 질문을 이해 모르겠지만, 주장을

우리가 효과적으로 getHelp를 디렉토리, 수입, 부하를 검색하고 바로 전화를 각 작업의 인스턴스를해야()

생각

은 분명히 사실입니다. 예를 들어, 클래스는 정적 인 컴파일 타임 데이터를 얻기 위해 인스턴스를 인스턴스화 (무거운) 할 필요가 없습니다. 특히 미리 파싱 된 .pyc 파일에서 작업하는 경우 로더가 상당히 빠릅니다.

나는 예에 대해 생각하고 있지만, 인스턴스가 이전에 생성 할 필요가 없다로

import Task 
import TestTask 
print(TestTask.description) 

tt = TestTask() 
print(tt.get_help()) 

에 거의 순간적으로 상대해야한다는 주목할 가치가있다.

내가 오기 속도 테스트로서 112K 소스 라인 (194 개)을 포함하는 모듈의 파이썬 표준 라이브러리를 사용한 예

첨가. 요약 된 코드는 다음과 같습니다.

import abc 
import aifc 
import anydbm 
import argparse 
import ast 
… 
import webbrowser 
import whichdb 
import xdrlib 
import xmllib 
import xmlrpclib 
import zipfile 
print(tty.setraw.__doc__) 

내 저전력 노트북에서 230ms로 실행됩니다. __doc__ 특성은 미리 구문 분석 된 .pyc 파일에서로드하는 경우에도 가져 오기시 이름에 바인딩되는 docstring 함수입니다.

+0

그래, 난 정적 컨텍스트에서이 일을하는 걸 좋아해. 그러나 동적 인 맥락에서 같은 일을 원활하게 할 수 있어야합니다. 인스턴스 문맥에서 클래스 메소드를 쉽게 사용할 수 있습니까? 나는 또한 마지막 문장에 혼란 스럽다. tt = TestTask()가 인스턴스를 생성 할 때 인스턴스가 어떻게 필요하지 않습니까? – Will

+1

@ msw는 클래스의 인스턴스화없이 클래스의 속성에 액세스 할 수 있으며 두 번째 예제와 비교하여 첫 번째 예제가 훨씬 빠릅니다 (클래스를 인스턴스화 할 필요가 없기 때문에) 고 말합니다. –

+0

아, 그래, "후자"는 나를 혼란스럽게했다. – Will

관련 문제