programing

Python의 eval()은 무엇을 합니까?

javaba 2023. 1. 29. 20:31
반응형

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 가 합니다.TypeErrorPython 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

반응형