2011-02-16 1 views
4

나는 다음과 같은 성명을 더 유연하게 만들기 위해 노력하고 있어요 :파이썬 : eval, exec 또는 ..를 사용해야합니까?

for posting in page.findAll(attrs = {"id": re.compile(r'''post\d+''')}): 

다음 부분은 CSV 파일에서 동적으로 검색 및 문자열 (예를 들어 캐릭터라는 시험)에 저장된다. CSV는 안전한 위치에 저장되며 관리자 만 액세스 할 수 있습니다.

attrs = {"id": re.compile(r'''post\d+''')} 

그냥 테스트 대신에 eval (test) 또는 exec (test)를 사용하여 다음과 같이 변수를 통합 할 수 있습니까? 당신이 (파일 내용이 입력) 사용자 입력에서 코드를 실행하려면

for posting in page.findAll(test)): 
+2

: 먼저

>>> args = ast.literal_eval('{"a":1}') >>> args {'a': 1} 

당신은로 사용할 수 있습니다. "Dear"및 "Thanks"를 생략 할 수 있습니다. 그들은 도움이되지 않습니다. 정말. 이것을 생략하는 것은 무례하지 않습니다. 둘째. 귀하의 질문을보십시오. "대담한"것은 효과가 없었습니까? ** 좀 더 명확하게하기 위해 ** 업데이트 **하십시오. –

+7

셋째, SO에 오신 것을 환영합니다. 비록 당신이 우리의 모든 단점을 아직 알지 못한다 할지라도, 신선한 피는 지역 사회에 좋습니다. – nmichaels

답변

5

, 당신이이 이름이나 특히 (다른 의해 eval 또는 exec을해야합니다, 당신은 문에 대한 exec 필요 - 할당이 성명).

하지만 싶지 않아 (그리고 안) 그 (단지 DICT 저장) 할당을 드롭 등, 완전히 불필요 악 불안의와 re.compile 호출, 다음 ast.literal_eval을 사용할 수 있기 때문에, 그렇게 (여전히 구문 오류와 합리적인 오류 메시지를 표시하기 위해 잘못 될 수있는 모든 것을 잡아야하지만 악의적 인 코드는 불가능에 가깝고 더러운 것은 아닙니다). 로드 후 re.compile을 적용 할 수 있습니다. 필요한 경우 필요합니다.

0

아니요 - 이건 파이썬이 아닙니다 - 이름 지정된 매개 변수와 원하는 값을 ery로 작성하여 함수를 사전으로 호출 할 수 있습니다. 이 경우, "attrs"키에 해당하는 사전도 사전입니다. 함수를 호출 할 때 그냥에 "**"사전 이름 앞에 추가 :

test= {"attrs": {\"id\": re.compile(r'''post\d+''')} } 

for posting in page.findAll(**test}): 
    (...) 
+0

질문은 파일에서 동적으로'attrs'를 로딩하는 것에 관한 것이지, 사전을 푸는 것에 관한 것이 아닙니다. – delnan

+0

그러면 파일의 데이터에서 사전에 문자열로 데이터를 채우는 데 어떤 문제가 있습니까? – jsbueno

1

을 당신이 CSV 소스를 통해 전혀 제어 할 수없는 경우를 제외하고, 피, 모든로드 이러한 종류의 비용에.

  • csv 모듈
  • 을 사용하여 파일로를 json 모듈
  • 쓰기를 사용하여 JSON으로 데이터를 저장하십시오 pickle 모듈을 사용하여 seriliazed 데이터 (또는 더 나은, 단지 저장 문자열)로 정규식 저장

    그런 다음 파일에서 데이터를 가져 오려면 반대의 작업을 수행하십시오.

    CSV 생성을 제어 할 수없는 경우 split 또는 re 모듈을 사용하여 수동으로 데이터를 추출해보십시오.

    evalexec은 '마지막 기회 솔루션'입니다. 다른 방법이 없다면 사용하지 마십시오.

  • +0

    CSV는 안전한 위치에 저장되며 관리자 만 액세스 할 수 있습니다. – user620007

    +0

    @ user620007 : 관리자가 시스템을 구축했거나 다른 사람의 시스템과의 인터페이스를 시도하고 있습니까? –

    1

    가장 안전한는 ast.literal_eval()입니다 : user620007 @

    some_function_or_method(**args)