eval bằng Python – hàm eval trong python

Cổng thông tin Khoa học Máy tính dành cho những người yêu thích máy tính. Nó bao gồm các bài báo về khoa học máy tính và lập trình được viết tốt, được tư duy tốt và được giải thích tốt, các câu đố và thực hành / lập trình cạnh tranh / các câu hỏi phỏng vấn công ty.

Bạn đang xem : Hàm eval trong python

Hàm eval () trong Python phân tích cú pháp đối số biểu thức và đánh giá nó như một biểu thức python và chạy biểu thức python (mã) trong chương trình.

Cú pháp eval () trong Python

eval (expression, global = None, local = None)

Tham số eval () trong Python

  • biểu thức: chuỗi này được phân tích cú pháp và đánh giá dưới dạng biểu thức Python
  • toàn cục (tùy chọn): một từ điển để chỉ định các phương thức và biến toàn cục có sẵn.
  • local (tùy chọn): một từ điển khác để chỉ định các phương thức và biến cục bộ có sẵn.

Ví dụ về Python eval ()

< / h2>

Ví dụ 1: Ví dụ để chứng minh việc sử dụng eval ()

Hãy để chúng tôi khám phá nó với sự trợ giúp của một chương trình Python đơn giản. function_creator là một hàm đánh giá các hàm toán học do người dùng tạo.

Python3

từ toán nhập *

return "Khóa bí mật là 1234"

def chức năng on_creator ():

expr = input ( "Nhập hàm (theo x): " )

x = int ( input ( "Nhập giá trị của x:" ))

y = eval (expr)

print ( " y = {} " . format (y) )

if __ name__ = = "__ main__" :

function_creator ()

 
 

Đầu ra:

 Nhập hàm (theo x): x * (x + 1) * (x + 2)
Nhập giá trị của x: 3
y = 60 

Hãy để chúng tôi phân tích đoạn mã một chút:

  • Hàm trên nhận bất kỳ biểu thức nào trong biến x strong > làm đầu vào.
  • Sau đó, người dùng phải nhập giá trị x .
  • Cuối cùng, chúng tôi đánh giá biểu thức python bằng cách sử dụng eval () chức năng tích hợp bằng cách chuyển expr dưới dạng một đối số.

Ví dụ 2: Các phép toán sử dụng hàm eval

Python3

< p class = "ring-load" id = "run-and-edit-loader">

< / p>

đánh giá = 'x * (x + 1) * (x + 2) '

in (đánh giá)

print ( type (đánh giá))

< p class = "line number5 index4 alt2"> x = 3 < / p>

print < / code> ( type (x))

< p class = "line number7 index6 alt2">

biểu thức = eval (đánh giá)

print (expression)

print ( type (expression))

 
 

Output

 x * (x + 1) * (x + 2)
& lt; lớp 'str' & gt;
& lt; lớp 'int' & gt;
60
& lt; lớp 'int' & gt;

Vấn đề về lỗ hổng bảo mật với eval

Phiên bản function_creator hiện tại của chúng tôi có một vài lỗ hổng. Người dùng có thể dễ dàng hiển thị các giá trị ẩn trong chương trình hoặc gọi một hàm nguy hiểm vì eval sẽ thực thi bất kỳ thứ gì được chuyển cho nó.

Ví dụ: nếu bạn nhập như thế này:

 Nhập hàm (theo x): secret_ functions ()

Nhập giá trị của x: 0 

Bạn sẽ nhận được kết quả đầu ra:

 y = Khóa bí mật là 1234 

Ngoài ra, hãy xem xét tình huống khi bạn đã nhập mô-đun os trong chương trình python của mình. Mô-đun hệ điều hành cung cấp một cách di động để sử dụng các chức năng của hệ điều hành như đọc hoặc ghi tệp. Một lệnh duy nhất có thể xóa tất cả các tệp trong hệ thống của bạn. Tất nhiên, trong hầu hết các trường hợp (như các chương trình máy tính để bàn), người dùng không thể làm gì hơn những gì họ có thể làm bằng cách viết tập lệnh python của riêng họ, nhưng trong một số ứng dụng (như ứng dụng web, máy tính kiosk), điều này có thể là một rủi ro! < / p>

Giải pháp là hạn chế eval chỉ các hàm và biến mà chúng tôi muốn cung cấp.

Làm cho eval an toàn

eval đi kèm với cơ sở chuyển một cách rõ ràng danh sách các hàm hoặc biến mà nó có thể truy cập. Chúng ta cần chuyển nó dưới dạng đối số dưới dạng từ điển.

Python3

từ toán học nhập * < / p>

def secret_ function ():

return < code class = "string"> "Khóa bí mật là 1234"

def function_creator ():

expr = input ( "Nhập hàm (theo x):" )

x = int ( input ( " Nhập giá trị của x: " ))

safe_dict [ 'x' ] = x

y = eval (expr, { "__ builtins__" : Không có }, safe_dict) < / code>

print ( " y = {} " . format (y))

if __ name__ = = "__ main__ " :

safe_list = [ 'acos' , 'asin' , 'atan' , 'atan2' , 'ceil' , 'cos' ,

'cosh' , 'Degree' , 'e' , 'exp' , 'fabs' < / code> , 'floor' ,

'fmod' , > >, 'ldexp' < code class = "string"> 'log10' ,

'modf' , 'pi' , 'pow' , 'radians' , 'sin' , 'sinh' , 'sqrt' ,

'tan' , 'tanh' ]

safe_dict = dict ([(k, local (). get (k, Không )) cho k trong < code class = "trơn"> safe_list])

function_creator ()

 
 

Bây giờ nếu chúng tôi cố gắng chạy các chương trình trên như:

 Nhập function (theo x): secret_ functions ()
Nhập giá trị của x: 0 

Chúng tôi nhận được kết quả đầu ra:

 NameError: name 'secret_osystem' không được xác định 

Hãy để chúng tôi phân tích đoạn mã trên từng bước:

  • Trước hết, chúng tôi tạo một danh sách các phương pháp mà chúng tôi muốn cho phép là safe_list .
  • Tiếp theo, chúng tôi tạo từ điển các phương pháp an toàn. Trong từ điển này, khóa là tên phương thức và giá trị là không gian tên cục bộ của chúng.
 safe_dict = dict ([(k, local () .get (k, Không có))
for k in safe_list]) 
  • local () là một phương thức tích hợp trả về một từ điển ánh xạ tất cả các phương thức và biến trong phạm vi cục bộ với không gian tên của chúng.
 safe_dict ['x'] = x 

Tại đây, chúng tôi cũng thêm biến cục bộ x vào safe_dict. Không có biến cục bộ nào khác ngoài x sẽ được xác định bởi hàm eval .

  • eval chấp nhận các từ điển của local cũng như các biến global làm đối số. Vì vậy, để đảm bảo rằng không có phương thức tích hợp nào khả dụng cho biểu thức eval , chúng tôi chuyển một từ điển khác cùng với safe_dict , như được hiển thị bên dưới:
 y = eval (expr, {"__builtins __": None}, safe_dict) 

Vì vậy, theo cách này, chúng tôi đã thực hiện eval chức năng an toàn trước bất kỳ sự tấn công nào có thể xảy ra!

Công dụng của eval

eval không được sử dụng nhiều vì lý do bảo mật như chúng tôi đã khám phá ở trên.

Tuy nhiên, nó có ích trong một số trường hợp như:

  • Bạn có thể muốn sử dụng nó để cho phép người dùng nhập “Scriptlets”: các biểu thức nhỏ (hoặc thậm chí là các hàm nhỏ), có thể được sử dụng để tùy chỉnh hoạt động của một hệ thống phức tạp.
  • eval đôi khi cũng được sử dụng trong các ứng dụng cần đánh giá các biểu thức toán học. Điều này dễ dàng hơn nhiều so với việc viết trình phân tích cú pháp biểu thức.

Blog này được đóng góp bởi Nikhil Kumar . Nếu bạn thích GeeksforGeeks và muốn đóng góp, bạn cũng có thể viết một bài báo bằng cách sử dụng donate.geeksforgeeks.org hoặc gửi bài viết của bạn qua đường bưu điện tới donate@geeksforgeeks.org. Xem bài viết của bạn xuất hiện trên trang chính của GeeksforGeeks và trợ giúp những Geeks khác.

Vui lòng viết bình luận nếu bạn thấy bất kỳ điều gì không chính xác hoặc bạn muốn chia sẻ thêm thông tin về chủ đề đã thảo luận ở trên.

My Personal Notes


Xem thêm những thông tin liên quan đến chủ đề hàm eval trong python

The eval() method parses the expression passed to this and runs python code within the program

  • Tác giả: Programmer Banda
  • Ngày đăng: 2021-03-24
  • Đánh giá: 4 ⭐ ( 8459 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: In simple terms, the eval() function runs the python code (which is passed as an argument) within the program.
    Warnings when using eval():
    Consider a situation where you are using a Unix system (macOS, Linux etc) and you have imported the os module. The os module provides a portable way to use operating system functionalities like reading or writing to a file.

    If you allow users to input a value using eval(input()), the user may issue commands to change file or even delete all the files using the command: os.system('rm -rf *').

    shorts ytshorts Shorts python eval pythoneval pythonevalfunction pythontutorial evalfunctioninpython evalinpython pythontutorialforbeginners learnpython

Phương thức eval trong javascript

  • Tác giả: freetuts.net
  • Đánh giá: 5 ⭐ ( 6097 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Phương thức eval() có chức năng tính toán biểu thức toán học hoặc thức thi mã lệnh tùy thuộc vào tham số mà người dùng truyền vào khi khởi tạo phương thức.

Hàm Trong Python Không Thể Không Biết Năm 2022

  • Tác giả: mci.edu.vn
  • Đánh giá: 5 ⭐ ( 8841 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Bài viết cung cấp cho bạn đọc tất cả các hàm trong python: Định nghĩa, cấu trúc và cách sử dụng cũng như các ví dụ minh họa rõ ràng

Hàm eval() trong Python.

  • Tác giả: quantrimang.com
  • Đánh giá: 3 ⭐ ( 2629 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Trong bài viết này, Quantrimang sẽ tiếp tục giới thiệu cho bạn một hàm tích hợp sẵn trong Python, đó là eval(). Eval() là một tiện ích rất thú vị cho phép bạn chạy code Python (code này được truyền dưới dạng tham số) ngay trong chương trình.

Python: Python eval(): Đánh giá biểu thức động

  • Tác giả: v1study.com
  • Đánh giá: 4 ⭐ ( 5708 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Hiểu về eval() của Python Đối số đầu tiên: expression Đối số thứ hai: globals Đối số thứ ba: locals Đánh giá biểu

Ví dụ và công dụng của hàm eval trong Python

  • Tác giả: t3h.edu.vn
  • Đánh giá: 5 ⭐ ( 9708 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Hàm eval là một trong những hàm thú vị. Nhưng hàm này thú vị ở đâu thì cùng T3H giải mã ngay qua bài viết về hàm eval trong Python dưới đây bạn nhé!

The eval () function in Python.

  • Tác giả: techjee.railpage.com.au
  • Đánh giá: 3 ⭐ ( 4637 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: In this article, Quantrimang will continue to introduce you to a built-in function in Python, eval (). Eval () is an interesting utility that allows you to

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình

Xem Thêm  Cách tạo các thành phần tùy chỉnh trong React - phản ứng cách thêm một thành phần