Python의 eval()은 무엇을 합니까?
에서는 Python이라는 를 계속 .eval(input('blah'))
만, 그것이 알 수 .input()
★★★★★★ 。
그게 뭘 하는데?누가 설명 좀 해줄래?
eval 함수를 사용하면 Python 프로그램이 Python 코드를 실행할 수 있습니다.
eval 예제(진행형 셸):
>>> x = 1
>>> eval('x + 1')
2
>>> eval('x')
1
eval()
는 문자열을 코드로 해석합니다.사용자가 컴퓨터에서 코드를 실행하는 옵션으로 이 기능을 사용할 수 있기 때문에 많은 사용자가 이 기능을 사용할 수 있습니다.「 」가 eval(input())
★★★★★★★★★★★★★★★★★」os
Import에 할 수 .input()
os.system('rm -R *')
홈 디렉토리에 있는 모든 파일이 삭제됩니다(유닉스 시스템이 있는 경우).「」를 사용합니다.eval()
안안취취 취다다다다다을 다른해야 할 예를 , 문자열을 변환하는 해 보세요.int()
.
설명서에서 설명한 바와 같이eval()
또한 가지고 있다globals
★★★★★★★★★★★★★★★★★」locals
: 에서 수 있는 하기 위해 할 수 .eval
, 새로운 를 로드하면 python이 로드됩니다.locals()
★★★★★★★★★★★★★★★★★」globals()
다음과 같이 됩니다.
>>> globals()
{'__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__doc__': None,
'__spec__': None, '__builtins__': <module 'builtins' (built-in)>,
'__package__': None, '__name__': '__main__'}
그 안에 .builtins
시스템에 심각한 손상을 줄 수 있는 모듈입니다.하지만 우리가 원하지 않는 모든 것을 차단하는 것은 가능합니다.예를 들어 시스템에서 사용 가능한 코어의 도메인을 나타내는 목록을 작성합니다.에 8개의 코어가 리스트가 합니다.[1, 8]
.
>>> from os import cpu_count
>>> eval('[1, cpu_count()]')
[1, 8]
로 모든 ★★★★★★★★★★★★★★★★★★★★★★★★.__builtins__
사용할 수 있습니다.
>>> eval('abs(-1)')
1
모든 글로벌에 대한 액세스를 차단해 보겠습니다.
>>> eval('[1, cpu_count()]', {'__builtins__':None}, {})
TypeError: 'NoneType' object is not subscriptable
했습니다.__builtins__
기능을 통해 시스템을 보호할 수 있습니다.이 시점에서 공개하고 싶은 기능을 다시 추가할 수 있습니다.
>>>from os import cpu_count
>>>exposed_methods = {'cpu_count': cpu_count}
>>>eval('cpu_count()', {'__builtins__':None}, exposed_methods)
8
>>>eval('abs(cpu_count())', {'__builtins__':None}, exposed_methods)
TypeError: 'NoneType' object is not subscriptable
, 이제 제제 now now 가 나왔습니다.cpu_count
기능을 사용할 수 있지만 원하지 않는 것은 모두 차단합니다.제 생각에 이것은 매우 강력하며 일반적인 구현이 아닌 다른 답변의 범위로 볼 때 분명합니다., 으로 이런 느낌이 듭니다.eval
을 사용하다
N.B.
.kwargs
이치노가져온 텍스트를 실행하기 위해 파이프라인의 일부로 eval을 사용한다고 가정합니다.텍스트는 정확한 코드를 가질 필요가 없으며 템플릿 파일 형식을 따르면서도 원하는 모든 것을 실행할 수 있습니다.예를 들어 다음과 같습니다.
>>> from os import cpu_count
>>> eval('[1,cores]', {'__builtins__': None}, {'cores': cpu_count()})
[1, 8]
2.x Python 2.x 의 input(...)
eval(raw_input(...))
3 、 Python 3.x 。raw_input
was was was was was was was was 、 was was was was 。input
당신은 (입니다)의 문서를 보고 있었을 입니다).input
(Python 2.x) 。 ★★★★★eval(input(...))
3.하지만 Python 3.x 에서는 Python 3.x 가 합니다.TypeError
Python 2에 있습니다.
경우, 「 」eval
는, 사용합니다.input
이치노일반적으로 이것은 나쁜 관행으로 간주됩니다.
eval()
이름에서 알 수 있듯이 전달된 인수를 평가합니다.
raw_input()
is금 is is이다input()
python 3.x 버전입니다. 가장 는 " " " 입니다.eval()
「」의을 입니다.input()
2.x 의 2.x 에서 제공되고 있는 python.2.x 의 python.은 사용자가 입력한 데이터를 문자열로 했습니다.raw_input은 사용자 를 반환했습니다.
eval(input("bla bla"))
따, thus, 을, 의, 제, 제의 기능을 재현하고 .input()
데이터 , 2.에서는 " " "를 참조해 주세요.
: 요대: :eval()
하여 " "를 참조해 주세요.eval('1 + 1')
22파운드를 했습니다.
한 줄을 읽고 해석하는 오해의 소지가 있는 예일 수도 있습니다.
★★를 해 보세요.eval(input())
라고 입력합니다."1+1"
해야 돼요. - 인쇄해야 돼요.2
평가하다
eval()
전달된 문자열을 Python 식으로 평가하여 결과를 반환합니다.를 들어, 「」라고 하는 것은,eval("1 + 1")
에서는 '해당하다'는 표현을 합니다."1 + 1"
()(2)하다
헷갈릴 수 있는 이유 중 하나는 인용한 코드가 어느 정도 간접적인 수준이기 때문입니다.먼저 내부 함수 호출(입력)이 실행되므로 사용자에게 "blah" 프롬프트가 표시됩니다.예를 들어, "1 + 1"(명확하게 하기 위해 따옴표를 붙이고 프로그램을 실행할 때 따옴표를 입력하지 마십시오)로 응답한다고 가정하면 입력 함수는 문자열을 해석하고 결과(2)를 반환하는 외부 함수(평가)로 전달됩니다.
eval에 대한 자세한 내용은 여기를 참조하십시오.
의 중 eval()
비단뱀예를 들어 사전의 파일 문자열 표현에서 로드:
running_params = {"Greeting":"Hello "}
fout = open("params.dat",'w')
fout.write(repr(running_params))
fout.close()
이를 변수로 읽고 편집합니다.
fin = open("params.dat",'r')
diction=eval(fin.read())
diction["Greeting"]+="world"
fin.close()
print diction
출력:
{'Greeting': 'Hello world'}
때 또 하나의 으로는 '어느 정도의 리터럴로 하다'를 사용하는 .ast.literal_eval()
몇 가지 예 몇 、 [ ] :
import ast
# print(ast.literal_eval('')) # SyntaxError: unexpected EOF while parsing
# print(ast.literal_eval('a')) # ValueError: malformed node or string
# print(ast.literal_eval('import os')) # SyntaxError: invalid syntax
# print(ast.literal_eval('1+1')) # 2: but only works due to a quirk in parser
# print(ast.literal_eval('1*1')) # ValueError: malformed node or string
print(ast.literal_eval("{'a':1}")) # {'a':1}
문서에서:
표현식 노드 또는 Python 리터럴 또는 컨테이너 디스플레이를 포함하는 문자열을 안전하게 평가합니다.제공된 문자열 또는 노드는 문자열, 바이트, 숫자, 튜플, 목록, 딕트, 세트, 부울란 및 없음의 Python 리터럴 구조로만 구성될 수 있습니다.
이것은 값을 직접 구문 분석할 필요 없이 신뢰할 수 없는 소스의 Python 값을 포함하는 문자열을 안전하게 평가하는 데 사용할 수 있습니다.연산자 또는 인덱싱과 같은 임의로 복잡한 표현식은 평가할 수 없습니다.
왜 그렇게 제한적인지에 대해서는 메일링 리스트에서 다음과 같이 설명합니다.
연산자 식을 리터럴로 허용하는 것은 가능하지만 현재 구현보다 훨씬 복잡합니다.단순한 실장은 안전하지 않습니다.기본적으로 무제한 CPU 및 메모리 사용을 쉽게 유도할 수 있습니다("9**9**9" 또는 "없음]*9*9").
이 함수는 repr()에 의해 문자열화된 리터럴 값 및 컨테이너를 "다시 읽기" 할 때 유용합니다.예를 들어 JSON과 비슷하지만 더 강력한 형식의 시리얼라이제이션에 사용할 수 있습니다.
하면 " " " 가 됩니다.input()
문자열이 반환됩니다.
>>> input('Enter a number: ')
Enter a number: 3
>>> '3'
>>> input('Enter a number: ')
Enter a number: 1+1
'1+1'
eval()
는 문자열인 반환된 값(또는 식)을 평가하고 정수/소수를 반환합니다.
>>> eval(input('Enter a number: '))
Enter a number: 1+1
2
>>>
>>> eval(input('Enter a number: '))
Enter a number: 3.14
3.14
여기서 좀 더 것 .int()
★★★★★★★★★★★★★★★★★」float()
.
>>> float(input('Enter a number: '))
Enter a number: 3.14
3.14
eval는 3개의 .eval()을 사용하여합니다.
구문: eval(표현, 글로벌, 로컬)
of #ipsion 3 expression " "
# globals(sublic) #sublic
#(substablic) #substablished
#는 # 사용 가 높은 사용 사례입니다
x="{'name':'abhi','mydict':{'sub':'python'}}"
y=dict(x)
print(y,type(y)) # ValueError: dictionary update sequence element #0 has length 1; 2 is required
z=eval(x)
print(z,type(z)) #{'name': 'abhi', 'mydict': {'sub': 'python'}} <class 'dict'>
언급URL : https://stackoverflow.com/questions/9383740/what-does-pythons-eval-do
'programing' 카테고리의 다른 글
MariaDB 컬럼스토어 LAST_INSERT_ID() 대체 (0) | 2023.01.29 |
---|---|
하위 도메인 간의 PHP 세션 (0) | 2023.01.29 |
MySQL Like 다중값 (0) | 2023.01.29 |
함수 포인터 정의가 앰퍼샌드 '&' 또는 아스터리스크 '*'의 수에 관계없이 작동하는 이유는 무엇입니까? (0) | 2023.01.29 |
Spring MVC 3 컨트롤러에서 문자열 메시지만 반환 (0) | 2023.01.29 |