2014-09-26 4 views
1

다른 클래스에서 eval을 사용하여 클래스 정의를 만들 수 있습니까?Python eval을 사용하여 클래스를 평가하는 방법

evalstr = str("class MyScreen(Screen):\n\tpass\n") 
eval(evalstr) 

다른 클래스 메서드에서이 코드를 실행하고 싶습니다. 그러나 오류를 반환합니다.

+0

당신이 점점 오류 및 오류 (위의 코드, 즉 컨텍스트를) 생성하는 코드와 질문을 업데이트하십시오하십시오 class 문이 모듈의 글로벌 수준에 있어야합니다 말한다 아무것도 없다. – isedev

+0

'type'을 사용하여 문제의 핵심 인 경우 유형을 동적으로 생성 할 수 있습니다. – matsjoyce

+1

왜이 일을하는거야? – jonrsharpe

답변

1

당신은 식을 평가하고 가치의 반환

evalstr = str("class MyScreen(Screen):\n\tpass\n") 
exec(evalstr) 

eval 여기 exec하지 eval (옆으로 보안 문제를) 할 수 있습니다. exec은 임의의 코드 문자열을 명령문으로 실행하는 데 사용되며 여기에서 필요한 코드 문자열입니다.

그러나 심각하게도 이것은 대부분의 경우에 발생하기를 기다리고있는 보안 재앙입니다. 코드 대신 문자열을 쓰는 것과 같은 대안을 고려해보십시오.

편집 : 아마도 Chepner의 답변은 올바른 방법 일 것입니다. 무엇 type 때문에, class 문을 않는 실행하는 것도 기본 메타 클래스입니다 이것은 런타임에 클래스를 생성하는 올바른 방법이다 (사실 본질적으로

MyScreen = type("MyScreen", (Screen,), {}) 

:

+0

확실히,'exec'를 남용하기 쉽습니다. 그리고 대부분의 경우 (이 것과 같이) 원하는 결과를 얻는 더 좋은 방법이 있습니다. 그러나'exec '의 사용은 당신의 주장이 [정상] (** http://kkcd.com/327/)임을 보장 할 수 있다면 안보 우려가되어서는 안된다. 아니면 그렇지? 물론,'exec'를 부담없이 사용하는 대부분의 사람들은'exec'ing 코드가 제대로 소독되지 않았 음을 보장하지 못합니다 (또는 할 수 없습니다). –

+0

@ PM2Ring은'exec' 또는'eval'을 사용하여 이것을합니다 이 경우 문자열은 실행 시간 전에 알려지지 않을 것이라고 제안합니다. 그러나 가까운 질문을 보면 그것이 OP로 보입니다. 당신이 중첩 된 클래스를 가질 수 있다는 것을 깨닫지 못했습니다. 코드가 위생 처리되면 안전합니다. –

+0

이 경우에는 문자열이 런타임 전에 알려지지 않았다고 제안하는 데 동의합니다. 그리고 저는 우리가 두 문자열 모두를 적절히 삭제하는 것보다 처음에'exec' 나'eval'을 사용하는 것을 피하는 것이 일반적으로 쉽다는 것에 동의합니다. 특히 사용자 입력에 크게 의존하는 경우 더욱 그렇습니다. 나는'exec' 나'eval'을 사용하는 것이 위험 할 수는 있지만 본질적으로 위험하지는 않습니다. –

1

class은 진술이고 eval은 진술이 아닌 표현식을 평가하기 때문에 eval을 사용할 수 없습니다. exec을 사용할 수 있습니다.

4

대신 type 기능을 사용하여 파이썬에서).

"간단하게"클래스를 정의 할 수도 있습니다.

class Something(object): 

    # Define a new class here... 
    class MyScreen(Screen): 
     pass 

    def __init__(self): 
     """Initialize a Something object""" 
     # ... or here 
     class MyScreen(Screen): 
      pass 
관련 문제