문제

나는 파이썬으로 파일을 구문 분석하고 있습니다 pyparsing (보고서 파일입니다 PSAT Matlab에서는 중요하지 않습니다). 여기 내가 지금까지 가지고있는 것입니다. 나는 그것이 엉망이라고 생각하고 그것을 개선하는 방법에 대한 조언을 원합니다. 구체적으로, pyparsing으로 문법 정의를 어떻게 구성해야합니까?

하나의 기능으로 모든 문법 정의가 있어야합니까? 그렇다면 하나의 큰 기능이 될 것입니다. 그렇지 않다면 어떻게 분해합니까? 현재 파일 섹션에서 분할되었습니다. 한 곳에서 한 번만 호출되는 많은 기능을 만드는 것이 가치가 있습니까? 나에게도 옳은 느낌이 들지 않습니다.

모든 입력 및 출력 코드를 별도의 파일에 다른 클래스 함수로 배치해야합니까? 그것은 수업의 목적을 훨씬 더 명확하게 만들 것입니다.

또한 파일을 구문 분석하고 정신 검사를 수행하고 클래스에 데이터를 저장하는 더 쉬운 방법이 있는지 알고 싶습니다. 나는 이것을하는 데 많은 시간을 보내는 것 같습니다.

(답변을 받아 들일 것입니다 충분히 좋습니다 또는 pyparsing 대신 x를 사용하십시오 사람들이 동의하는 경우)

도움이 되었습니까?

해결책

나는 단일 큰 방법을 사용하여 파서를 만드는 것과 지금 당신이 가지고있는 방식으로 단계적으로 가져갈 수 있습니다.

나는 당신이 슬릿 ( "Reppress Literal", 내가 추정), StringTolits 및 Decimaltable과 같은 유용한 도우미 유틸리티를 정의했음을 알 수 있습니다. 이것은 나에게 좋아 보인다.

나는 당신이 결과 이름을 사용하는 것을 좋아합니다. 그들은 당신의 후 포스트 코드의 견고성을 실제로 향상시킵니다. Pyparsing 1.4.7에 추가 된 바로 가기 양식을 사용하는 것이 좋습니다.

busname.setResultsName("bus1")

~와 함께

busname("bus1")

이것은 코드를 상당히 정리할 수 있습니다.

숫자 인덱스를 사용하여 개별 토큰에 액세스하는 위치를 확인하고 대신 결과 이름을 할당하기 위해 구문 분석 작업을 되돌아 보겠습니다. GetStats가 돌아 오는 경우는 다음과 같습니다 (ngroup + sgroup).setParseAction(self.process_stats). Process_stats는 다음과 같은 참조가 있습니다.

self.num_load = tokens[0]["loads"]
self.num_generator = tokens[0]["generators"]
self.num_transformer = tokens[0]["transformers"]
self.num_line = tokens[0]["lines"]
self.num_bus = tokens[0]["buses"]
self.power_rate = tokens[1]["rate"]

나는 당신이 값과 통계를 그룹화 한 것을 좋아하지만 계속해서 "Network"및 "Soln"과 같은 이름을 부여합니다. 그런 다음이 구문 분석 조치 코드를 다음과 같이 쓸 수 있습니다 (DICT 요소 표기법 대신 읽기 쉬운 객체-입력 표기법으로도 변환했습니다) :

self.num_load = tokens.network.loads
self.num_generator = tokens.network.generators
self.num_transformer = tokens.network.transformers
self.num_line = tokens.network.lines
self.num_bus = tokens.network.buses
self.power_rate = tokens.soln.rate

또한 스타일 질문 : 왜 '+'연산자를 사용하는 대신 때때로 명시 적 및 생성자를 사용합니까?

busdef = And([busname.setResultsName("bus1"),
            busname.setResultsName("bus2"),
            integer.setResultsName("linenum"),
            decimaltable("pf qf pl ql".split())])

이것은 쉽게 작성된 것입니다.

busdef = (busname("bus1") + busname("bus2") + 
            integer("linenum") + 
            decimaltable("pf qf pl ql".split()))

전반적으로, 나는 이것이이 복잡성의 파일에 관한 것이라고 생각합니다. 나는 비슷한 형식 (독점적으로, 불행히도 공유 할 수 없음)을 가지고 있는데, 여기에는 코드를 당신이 가진 방식과 비슷한 조각으로 작성했지만 다음과 같은 큰 방법으로 다음과 같은 것입니다.

def parser():
    header = Group(...)
    inputsummary = Group(...)
    jobstats = Group(...)
    measurements = Group(...)
    return header("hdr") + inputsummary("inputs") + jobstats("stats") + measurements("meas")

그룹 구성은 특히 구문 분석 된 데이터의 각 섹션 내에서 결과 이름에 대한 일종의 네임 스페이스를 설정하는 데 특히 큰 구문 분석기에서 유용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top