2014-06-09 7 views
1

직접 설명하려면 사용자 입력을 "구문 분석"하고 싶습니다. - 간단한 입력 문자열 -> 출력 문자열.함수 이름을 포함하는 구문 사전을 관리하는 명확한 방법

그러나 사전 (정규식 검사)에 대한 입력 문자열을 단순히 검사하는 것과는 별도로 구문 분석하는 "논리적"방법은 없습니다. 지금 이것은 전혀 어렵지 않습니다. 정규식 검색 문자열 키 & 정규식/함수 포인터 값을 사용하여 사전을 만들 것입니다.

그러나 문제는 약 100-200 개의 "키"가있을 것입니다. 그리고 미래에 키를 추가/제거 (아마도 병합)하고자하는 자신을 쉽게 볼 수 있습니다.
그런 사전을 만드는 것이 "구조화 된"것처럼 보이는 이유는 무엇입니까? "데이터"를 "코드"로부터 멀리 유지하십시오. (데이터는 정규식 - 함수 이름 쌍이 될 것입니다)?

+1

귀하의 질문을 이해할 수 있는지 잘 모르겠습니다. 코드에 문자열 리터럴로 가득 찬 거대한 사전을 갖고 싶지 않으십니까? 그렇다면, 내 생각은 사전을 JSON 형식으로 파일에 저장하고 프로그램 실행시 파일을 읽는 것입니다. – timgeb

+0

사용자 입력이 전혀 형식화되지 않은 경우 pyparsing 라이브러리를 살펴보십시오. 그 외의 경우 JSON으로 저장하고 실행시 변수로 읽는 것에 동의합니다. – GleasonK

+1

@ paul23 : 작은 사전 샘플을 보는 것도 도움이 될 것입니다. – mtik00

답변

1

사전을 JSON 형식의 파일에 저장하고 함수 이름을 일반 문자열로 저장하십시오. 데모 JSON 파일을로드하는 방법 :

{"somestring":"myfunction"} 

코드 :

import json 
d = json.load(open('very_small_dic.txt', 'r')) 
print(d) # {'somestring': 'myfunction'} 

문자열을 얻을 방법 : 함수 맵핑을 :

먼저 당신이로드 샘플 파일의

콘텐츠 위의 코드에서 설명한대로 파일에서 사전을 선택하십시오. 그런 다음 함수 이름의 문자열이 실제 함수로 바뀌는 새 사전을 작성합니다. 데모 :

def myfunction(x): 
    return 2*x 

d = {'somestring': 'myfunction'} # in the real code this came from json.load 
d = {k:globals()[v] for k,v in d.items()} 
print(d) # {'somestring': <function myfunction at 0x7f36e69d8c20>} 
print(d['somestring'](42)) # 84  

또한 별도의 파일 myfunctions.py에 기능을 저장하고 getattr를 사용할 수 있습니다. 이것은 아마도 globals을 사용하는 것보다 더 깔끔한 방법 일 것입니다.

import myfunctions # for this demo, this module only contains the function myfunction 

d = {'somestring': 'myfunction'} # in the real code this came from json.load 
d = {k:getattr(myfunctions,v) for k,v in d.items()} 
print(d) # {'somestring': <function myfunction at 0x7f36e69d8c20>} 
print(d['somestring'](42)) # 84  
+0

문제는 "키"가 함수의 포인터/ID 여야한다는 것입니다. 나는 문자열을 함수에 매치 할 필요가있다. – paul23

+0

"문자열": 기능 ..두 번째 방법은 "핵심 기능"과 "사용자 기능"을 분리하므로 올바른 추상화 계층을 생성합니다. – paul23

0

또한 JsonSchema (http://json-schema.org/example1.html)를 사용할 수도 있습니다.

특정 키에 속한 값을 변환하려면 확실히 변환을 수행하는 함수를 작성해야한다고 생각합니다.

특정 키가 있는지 여부에 따라 입력을 살균하려는 경우 - 사전으로 변환하고 스키마를 정의한 다음 (필수/선택적 필드)/유형을 확인하는 것이 이상적입니다 또는 열거 형 목록에 대해 필드의 유효성을 검사하십시오.

관련 문제