다른 클래스에서 eval을 사용하여 클래스 정의를 만들 수 있습니까?Python eval을 사용하여 클래스를 평가하는 방법
evalstr = str("class MyScreen(Screen):\n\tpass\n")
eval(evalstr)
다른 클래스 메서드에서이 코드를 실행하고 싶습니다. 그러나 오류를 반환합니다.
다른 클래스에서 eval을 사용하여 클래스 정의를 만들 수 있습니까?Python eval을 사용하여 클래스를 평가하는 방법
evalstr = str("class MyScreen(Screen):\n\tpass\n")
eval(evalstr)
다른 클래스 메서드에서이 코드를 실행하고 싶습니다. 그러나 오류를 반환합니다.
당신은 식을 평가하고 가치의 반환
evalstr = str("class MyScreen(Screen):\n\tpass\n")
exec(evalstr)
eval
여기 exec
하지 eval
(옆으로 보안 문제를) 할 수 있습니다. exec
은 임의의 코드 문자열을 명령문으로 실행하는 데 사용되며 여기에서 필요한 코드 문자열입니다.
그러나 심각하게도 이것은 대부분의 경우에 발생하기를 기다리고있는 보안 재앙입니다. 코드 대신 문자열을 쓰는 것과 같은 대안을 고려해보십시오.
편집 : 아마도 Chepner의 답변은 올바른 방법 일 것입니다. 무엇 type
때문에, class
문을 않는 실행하는 것도 기본 메타 클래스입니다 이것은 런타임에 클래스를 생성하는 올바른 방법이다 (사실 본질적으로
MyScreen = type("MyScreen", (Screen,), {})
:
확실히,'exec'를 남용하기 쉽습니다. 그리고 대부분의 경우 (이 것과 같이) 원하는 결과를 얻는 더 좋은 방법이 있습니다. 그러나'exec '의 사용은 당신의 주장이 [정상] (** http://kkcd.com/327/)임을 보장 할 수 있다면 안보 우려가되어서는 안된다. 아니면 그렇지? 물론,'exec'를 부담없이 사용하는 대부분의 사람들은'exec'ing 코드가 제대로 소독되지 않았 음을 보장하지 못합니다 (또는 할 수 없습니다). –
@ PM2Ring은'exec' 또는'eval'을 사용하여 이것을합니다 이 경우 문자열은 실행 시간 전에 알려지지 않을 것이라고 제안합니다. 그러나 가까운 질문을 보면 그것이 OP로 보입니다. 당신이 중첩 된 클래스를 가질 수 있다는 것을 깨닫지 못했습니다. 코드가 위생 처리되면 안전합니다. –
이 경우에는 문자열이 런타임 전에 알려지지 않았다고 제안하는 데 동의합니다. 그리고 저는 우리가 두 문자열 모두를 적절히 삭제하는 것보다 처음에'exec' 나'eval'을 사용하는 것을 피하는 것이 일반적으로 쉽다는 것에 동의합니다. 특히 사용자 입력에 크게 의존하는 경우 더욱 그렇습니다. 나는'exec' 나'eval'을 사용하는 것이 위험 할 수는 있지만 본질적으로 위험하지는 않습니다. –
class
은 진술이고 eval
은 진술이 아닌 표현식을 평가하기 때문에 eval
을 사용할 수 없습니다. exec
을 사용할 수 있습니다.
대신 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
당신이 점점 오류 및 오류 (위의 코드, 즉 컨텍스트를) 생성하는 코드와 질문을 업데이트하십시오하십시오
class
문이 모듈의 글로벌 수준에 있어야합니다 말한다 아무것도 없다. – isedev'type'을 사용하여 문제의 핵심 인 경우 유형을 동적으로 생성 할 수 있습니다. – matsjoyce
왜이 일을하는거야? – jonrsharpe