2013-08-12 2 views
0

누구나 pydev가 코드 완성을 위해 사용할 것을 결정하는 방법을 알고 있습니까? 코드 완성을 가능하게하는 일련의 클래스를 정의하려고합니다. __dict____slots__을 설정하기 위해 __new__을 사용해 보았지만 둘 다 pydev 자동 완성에 나열되지 않은 것 같습니다.이클립스의 pydev는 어떻게 코드 완성을합니까?

자동 완성 목록에 나열하려는 열거 집합이 있지만 생성자로 설정하고 싶습니다. 각 클래스마다 열거하지 마십시오.

그래서 오히려

class TypeA(object): 
    ValOk = 1 
    ValSomethingSpecificToThisClassWentWrong = 4 
    def __call__(self): 
     return 42 

보다 내가

def TYPE_GEN(name, val, enums={}): 
    def call(self): 
     return val 
    dct = {} 
    dct["__call__"] = call 
    dct['__slots__'] = enums.keys() 
    for k, v in enums.items(): 
     dct[k] = v 
    return type(name,(), dct) 

TypeA = TYPE_GEN("TypeA",42,{"ValOk":1,"ValSomethingSpecificToThisClassWentWrong":4}) 

내가 처리를 돕기 위해 무엇을 할 수있는 그런 짓을하고 싶습니다?

편집 : 의견은 내가하는 일에 대해 질문하는 것 같습니다. 다시 말하지만, 내가하고있는 것의 큰 부분은 코드 완성입니다. 저는 다양한 마이크로 컨트롤러와 통신하기 위해 프로토콜에 바인딩하는 파이썬을 사용하고 있습니다. 변경할 수있는 각 매개 변수 (수 백 가지가 있음)는 개념적으로 이름이 있지만, 프로토콜을 통해 사실상 무작위 인 ID를 사용해야합니다. 많은 매개 변수는 개념적으로 명명 된 값을 받아들이지 만 다시 정수로 나타냅니다. 따라서 enum.

라이브러리에 파이썬 모듈을 자동 생성하려고하므로 그룹은 오류가 발생하기 쉬운 숫자 대신 이름을 사용하여 변경하려는 것을 지정할 수 있습니다. __call__ 속성은 매개 변수의 id를 반환하고 열거 형은 매개 변수의 허용 값입니다.

예, 각 클래스의 자세한 버전을 생성 할 수 있습니다. 포인트가 자동 완성되어 각 클래스에 대해 한 줄씩 더 명확 해 보였습니다.

+0

즉석에서 클래스를 생성 할 필요가 없습니다. 또한 실시간으로 클래스를 생성하는 것은 자동 완성과 호환되지 않을 수도 있습니다. – user2357112

+0

이름을 하드 코딩하지 않으려면 왜 묻겠습니까? 문자열의'dict'에서 enum 값을 생성하면 어떤 이점이 있습니까? – jpmc26

+0

저는 pydev가 얼마나 똑똑한 지 모르지만 메타 클래스를 통해 enum을 정의 해 볼 수는 있습니다. – martineau

답변

0

"오프라인"편집기 (대화식 Python 셸과는 반대)에서는 실제로 Python의 코드를 완전히 완성 할 수 없습니다.

이유는 파이썬이 너무 동적이기 때문입니다. 기본적으로 어떤 것도 언제든지 바뀔 수 있습니다. TypeA.Val을 입력하고 완료를 요청하면 시스템은 어떤 객체 TypeA이 바인딩되어 있는지, 클래스가 무엇인지, 둘 모두의 속성을 알고 있어야합니다. 이러한 사실은 모두 3 가지로 변경 될 수 있습니다 (프로그램 실행 중에 특정 지점의 객체에만 바인딩되며 TypeA은 정의되지 않고 시작됩니다).

그래서 시스템에서 실행중인 프로그램의 어떤 지점을 완료해야합니까? 그리고 그것을 명시하는 명백한 방법이 있더라도 실제로 프로그램을 실행하지 않고 그 시점에서 프로그램의 모든 상태가 어떤 것인지를 알 수있는 일반적인 방법은 없습니다. 아마도 편집자를 원하지 않을 것입니다 !

그래서 pydev는 추측됩니다. 꽤 명확합니다. 모듈 foo에 클래스 블록 Bar을 정의한 경우 foo에서 가져온 이름 Bar이 해당 클래스를 참조하게됩니다. 따라서 어떤 이름이 Bar. 또는 obj = Bar()으로 생성 된 개체에서 액세스 할 수 있는지 알 수 있습니다. 물론 프로그램은 런타임에 foo.Bar을 다시 바인딩하거나 속성 집합을 변경하거나 import foo이 다른 파일을 치는 환경에서 실행할 수 있습니다. 그러나 그런 종류의 일은 거의 일어나지 않으며, 완성은 일반적인 경우에 유용합니다.

당신이 파이썬의 동적 언어 유연성을 너무 많이 사용할 때마다 기본적으로 완성도가 떨어지는 것을 의미합니다. 함수를 호출하여 클래스를 정의하는 것은 이러한 경우 중 하나입니다. TypeA의 이름이 ValOk이고 ValSomethingSpecificToThisClassWentWrong 인 것으로 추측 할 준비가되지 않았습니다. 어쨌든 TYPE_GEN에 대한 호출로 인해 발생하는 많은 객체가있을 수 있지만 모두 다른 이름을 사용합니다.

만약 당신의 주된 목표가 완성을 얻고 자한다면, 당신은 pydev를 쉽게 만들 수 있어야하고이 수업들을 전부 써야한다고 생각합니다. 물론 원하는 경우 Python 파일을 생성하기 위해 유사한 코드를 사용할 수도 있습니다 (텍스트로도 가능). 비록 실제로 클래스보다는 사전을 가지고 정의하는 더 많은 "구문상의 오버 헤드"가있는 것처럼 보입니다. 당신은 a = b보다는 항목 당 "a": b,를 쓰고 있습니다. 이들을 더 체계적으로 생성하거나 기존 정의 파일을 구문 분석 할 수 없다면, 정적 클래스 정의가 사전 쓰기 TYPE_GEN보다 읽기 쉽다고 생각합니다.

0

코드가 간단할수록 완료가 더 잘됩니다. 위와 같은 클래스 정의를 포함하는 파이썬 코드 파일을 생성하는 별도의 도구로 이것을 사용하는 것이 합리적일까요? 이것은 본질적으로 두 세계 모두에서 최고입니다. 이름/값 쌍을 JSON 또는 INI 파일에 넣거나 이름/값 쌍 사이에서 메서드 호출의 혼란을 제거하여 이름/값 쌍을 넣을 수도 있습니다. 유일한 단점은 코드가 변경 될 때 코드 파일을 재생성하기 위해 도구를 실행해야하지만 최소한 자동화 된 간단한 프로세스입니다.

개인적으로, 나는 좀 더 장황한 것을 만들고 수동으로 수업을 작성하지만, 그건 제 의견입니다.

부수적으로, 나는 클래스를 호출 할 수있게 만들지 않고 단지 id 클래스 변수 만 갖는 것이별로 도움이되지 않는다. 둘 다 입력 할 내용을 알고 있어야합니다. TypeA() vs TypeA.id. 인스턴스화를 방지하려면 __init__에 예외를 던지면 의도에 대해 좀 더 명확하게 알 수 있습니다.

1

좋아, 지적한대로이 코드는 너무 동적입니다 ... PyDev는 코드를 정적으로 분석합니다 (예 : 프로젝트 내부에있는 코드). 아직

, 몇 가지 대안이있다 :

옵션 1 :

당신은 당신의 라이브러리입니다 (예 : 사이트 패키지) 코드 분석의 PyDev 강제 할 수 동적을,이 경우를의 쉘을 통해 정보를 동적으로 얻을 수 있습니다.

이렇게하려면 사이트 패키지에 모듈을 만들고 인터프리터 구성에서 'forced builtins'에 모듈을 추가해야합니다. 자세한 내용은 http://pydev.org/manual_101_interpreter.html을 참조하십시오.

옵션 2 :

또 다른 옵션은 미리 정의 완료로 퍼팅 할 것이다 (하지만이 경우에는도없는 코드에서, 인터프리터 구성에 있어야 - 당신이해야 할 것 어쨌든 거기에 명시 적으로 완료하십시오.) 이 작업을 수행하는 방법은 위의 링크를 참조하십시오.

옵션 3 :

가 실제 코드를 생성합니다. 나는 당신이 파일의 내용을 출력하기 위해 파이썬 코드를 작성할 수 있고 나중에 필요한 것을 업데이트하기 위해 코드/재실행 코그를 변경할 수 있기 때문에 Cog (http://nedbatchelder.com/code/cog/)가 가장 좋은 대안이라고 생각한다. 코드가 PyDev의 라이브러리 였기 때문에 가장 좋은 대안이 될 것이라고 믿습니다. 구조가 명확 할 때 가지고있는 것을 더 잘 파악할 수있을 것입니다.

Java/C++ 등 다른 언어를 사용하는 경우 톱니 바퀴가 작동한다는 점에 유의하십시오. 따라서이 특정 문제와 상관없이 툴 세트에 추가하는 것이 좋습니다.

관련 문제