2014-11-01 4 views
-2

일반 설명 : 첫째로 : 나는 API에서 데이터를 가져 오는 수백 개의 모듈을 만들어야합니다. 모듈은 대부분 비슷한 구조를 가지지 만 일부 요소는 다양합니다 (예 : 메소드).문자열의 클래스 끝 찾기

둘째 : 많은 모듈을 나중에 편집해야합니다 (예 : 모듈의 메소드 변경).

그 때문에 는 I는 프로그램 작성 :

  • 는 (기록 모드) 모듈을 열어
  • 검색 (예 방법) 객체를 그것이 시작되는하고 끝나는 위치를 결정한다.
  • 그런 다음 개체를 다른 것으로 바꿉니다.

코드 예제

# I want to edit module_1 to module_100 and change their cook_method to bake_method. 
# Below is the code for only one of the 100 modules. 

with open('module_1.py', 'w+') as file: 
    old = file.read() 

    # method_loc is a function that returns a dict, 
    # containing start and end of the method i wanted to edit. 
    location_dct = method_loc(name='cook_method', string=old) 

    # change cook_method to bake_method 
    new = old[:location_dct['end']] + bake_method_as_string + old[location_dct['start']:] 
    file.write(new) 

문제 : 클래스가 매우 어렵다 종료 정확한 위치를 감지 . 문자열 메서드를 사용하여 메서드를 만들었지 만 너무 복잡하고 엉성함을 느낍니다. 나는 위의 것을 더 쉽게 만들 수있는 regular expressions을 수색하고 발견했다.

또한 pyclbr은 클래스가 끝나는 라인을 줄 수 있다면 좋지만 실제로는 그렇지 않습니다.

질문

  • 클래스 (또는 메소드 또는 함수 또는 딕셔너리가) 문자열로 열 모듈 내부에 끝나는 찾을 수있는 더 나은 방법이 있나요?
  • 일부 라이브러리에서 위의 기능을 사용할 수 있습니까?
  • 위의 작업을 수행하는 다른 방법이 있습니까?
+1

일반 텍스트가 아닌 구문 트리를 통해 코드를 수정하는 것이 좋습니다 (예 : ['ast'] (https://docs.python.org/2/library/ast.html)).) 또는 ['rope'] (http://rope.sourceforge.net/)/['traad'] (https://github.com/abingham/traad). – bereal

+0

나는 다른 방식으로 문제에 접근 할 것이다. 이러한 모듈이 데이터를 집계하기 위해 생성 된 경우 데이터베이스 (특정 필드 포함)에 저장 한 다음 DB에서 직접 데이터를 쿼리하는 것이 좋습니다. – user3378649

+0

@bereal 구문 트리가 무엇인지 전혀 알지 못합니다. 일반 텍스트의 문제점은 무엇입니까? 일반 텍스트로 주제에 대한 작업을 계속하는 것과 비교하여 보안 목표 명세서에 대해 배우는 것이 가치가 있습니까? –

답변

0

처음에는 전체 모듈과 일치하는 정규 표현식을 작성해야한다고 생각합니다. re.compile을 사용하여 패턴을 만들고 올바르게 배치 한 괄호와 일치시켜 일치하는 텍스트를 가져옵니다. 그런 다음 패턴 일치를 사용하여 메소드 이름을 다시 검색하고 올바른 장소 적용 수정에 도달 할 수 있습니다. PLY를 사용할 수도 있습니다. 정규 표현식에 대한 빠른 소개를 위해 컴파일러에 대한 책을 확인하십시오. 문제가 해결되기를 바랍니다.

+0

정규 표현식으로 파이썬을 구문 분석하도록 제안하는 것이 맞는지 이해합니까? – bereal

0

일반적으로 코드의 구문 분석 된 버전 (Abstract Syntax Tree)을 처리하는 것이 좋습니다. 그보다 더 믿을만하고 간단합니다. 파이썬은 standard module for that입니다.

그러나, 당신은 아주 특별한 경우를 처리하고 있기 때문에 (당신은 단지 클래스를 교체해야하고 당신이 자신을 생성하는 코드이다),이 같은 의견 코드 레이블을 지정할 수 있습니다 :

#CLASSBEGIN MyClass 

class MyClass: 
    ... 

#CLASSEND MyClass 

그 방법 , 당신은 코드를 파싱 할 필요가 없다. 지금까지 내가 기억하는 한,이 방법을 사용하는 코드 생성 도구는 거의 없다.

또 다른 방법은 Jinja2과 같은 템플릿 엔진을 사용하여 코드를 생성하는 것이므로 생성 된 클래스를 수정할 필요가 없으므로 매개 변수를 업데이트하고 새 버전을 다시 생성하면됩니다.

마지막으로, 많은 경우에 적절한 오브젝트 분해로 양을 최소화하거나 동적으로 생성 된 코드를 완전히 없앨 수 있습니다.