Hướng dẫn python eval(import) - python eval (nhập)

Hướng dẫn python eval(import) - python eval (nhập)

Nội dung chính

  • Ví dụ về hàm eval trong Python
  • Đối số và tham số hàm eval trong Python
  • Giá trị trả về từ hàm eval trong Python
  • Hạn chế việc sử dụng các phương thức và biến có sẵn trong eval ()
  • 1. Khi bỏ qua cả tham số global và local
  • 2. Truyền tham số global; tham số local bị bỏ qua
  • Mục lục bài viết:
  • Hiểu về eval()
  • Đối số đầu tiên: expression
  • Đối sô thứ hai: globals
  • Đối số thứ ba: locals
  • Đánh giá biểu thức bằng eval()
  • Biểu thức Boolean
  • Biểu thức toán học
  • Biểu thức Mục đích Chung
  • Giảm thiểu các vấn đề bảo mật của eval()
  • Hạn chế của globals và locals
  • Hạn chế sử dụng tên có sẵn
  • Hạn chế tên khi input dữ liệu
  • Hạn chế input dữ liệu là các hằng
  • Sử dụng eval() với input()
  • Xây dựng một trình đánh giá biểu thức toán học
  • Phần kết luận

Ví dụ về hàm eval trong Python

Về mặt kỹ thuật, hàm eval là một hàm tích hợp sẵn trong Python và cho phép lập trình viên chạy code Python (được truyền dưới dạng tham số) ngay trong chương trình. Hàm eval phù hợp để sử dụng khi lập trình viên muốn đánh giá biểu thức toán học hoặc đánh giá chuỗi. 

Cú pháp của hàm eval trong Python như sau:

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

Hàm eval() có ba tham số:

- bieuthuc: có thể là bất kỳ biểu thức hợp lệ nào của Python

- global: một dictionary chỉ định các phương thức và biến global có sẵn.

- local: một dictionary chỉ định các phương thức và biến local có sẵn.

>>> Xem thêm: Regex trong Python-Tìm hiểu về biểu thức chính quy trong Python Regex trong Python-Tìm hiểu về biểu thức chính quy trong Python

Ví dụ về hàm eval trong Python

def drivingage(age):

    if age>18:

        print("yes")

    else:

        print("no")

age=int(input("age"))

drivingage(age)

Output

age 6

no

Đối số và tham số hàm eval trong Python

Các đối số hoặc tham số của hàm eval là STRING (tham số toàn cục và cục bộ có thể được sử dụng làm đối số bên trong hàm eval), nhưng toàn cục phải được biểu diễn dưới dạng từ điển và cục bộ dưới dạng đối tượng được ánh xạ (mapping). 

Giá trị trả về từ hàm eval trong Python

Phương thức eval () trả về kết quả được đánh giá từ expression. Giá trị kết quả / trả về chủ yếu sẽ là số nguyên. 

Ví dụ: Ví dụ 1: Cách eval () hoạt động trong PythonVí dụ 1: Cách eval () hoạt động trong Python

x = 1

print(eval('x + 1'))

Đầu ra

2

Ở đây, eval()hàm đánh giá biểu thức x + 1 và print được  sử dụng để hiển thị giá trị này.

>>> Tham khảo: Khóa học lập trình Python Khóa học lập trình Python

Khai thác Eval bằng Python

Có một hàm trong code hỗ trợ lập trình viên lấy lại các loại mật khẩu hoặc dữ liệu quan trọng khác có thể nghiêm trọng. Người dùng có thể gọi các hàm này thông qua eval trong Python và truy cập các dữ liệu quan trọng mà họ cần.

Hạn chế việc sử dụng các phương thức và biến có sẵn trong eval ()

Tất cả các phương pháp và biến có sẵn được sử dụng trong expression (tham số đầu tiên đến eval()) có thể không cần thiết, hoặc thậm chí có thể có lỗ hổng bảo mật. Bạn có thể cần phải hạn chế việc sử dụng các phương thức và biến này cho eval(). Bạn có thể làm như vậy bằng cách chuyển tùy chọn global và local cũng như tham số (từ điển) cho hàm eval().

1. Khi bỏ qua cả tham số global và local

Nếu cả hai tham số bị bỏ qua, biểu hiện được thực thi trong phạm vi hiện tại. Bạn có thể kiểm tra các biến và phương pháp có sẵn bằng cách sử dụng mã sau:

print(eval('dir()')

2. Truyền tham số global; tham số local bị bỏ qua

Mục lục bài viết:

Hiểu về eval()

Đối số đầu tiên: expression Trên đây là một số kiến thức về hàm eval trong Python cùng các ví dụ cụ thể. Hy vọng bạn có thể tận dụng các thông tin mà bài viết mang lại trong quá trình làm việc với Python. Tìm hiểu thêm là Python và các ngôn ngữ lập trình khác qua các khóa học lập trình tại T3H

Đối sô thứ hai: globals



Đối số thứ ba: locals
Đánh giá biểu thức bằng eval()

Mục lục bài viết:

  • Hiểu về eval()
    • Đối số đầu tiên: expression
    • Đối sô thứ hai: globals
    • Đối số thứ ba: locals
  • Đánh giá biểu thức bằng eval()
    • Biểu thức Boolean
    • Biểu thức toán học
    • Biểu thức Mục đích Chung
  • Giảm thiểu các vấn đề bảo mật của eval()
    • Hạn chế của globals và locals
    • Hạn chế sử dụng tên có sẵn
    • Hạn chế tên khi input dữ liệu
    • Hạn chế input dữ liệu là các hằng
  • Sử dụng eval() với input ()
  • Xây dựng một trình đánh giá biểu thức toán học
  • Phần kết luận

Python 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 cho phép bạn đánh giá các biểu thức Python tùy ý từ đầu vào dựa trên chuỗi hoặc dựa trên mã biên dịch. Hàm này có thể hữu ích khi bạn đang cố gắng đánh giá động các biểu thức Python từ bất kỳ đầu vào nào có dạng chuỗi hoặc đối tượng mã đã biên dịch.

Mặc dù Python 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 là một công cụ cực kỳ hữu ích, nhưng hàm này có một số hàm ý bảo mật quan trọng mà bạn nên cân nhắc trước khi sử dụng nó. Trong hướng dẫn này, bạn sẽ tìm hiểu cách 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 hoạt động và cách sử dụng nó một cách an toàn và hiệu quả trong các chương trình Python của bạn.

Trong hướng dẫn này, bạn sẽ học:

  • Cách hoạt động của 
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    3
  • Cách sử dụng 
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    3 để đánh giá động đầu vào dựa trên chuỗi hoặc dựa trên mã đã biên dịch tùy ý
  • Cách 
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    3 làm cho mã của bạn không an toàn và cách giảm thiểu các rủi ro bảo mật liên quan.

Ngoài ra, bạn sẽ học cách sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 để viết mã một ứng dụng đánh giá tương tác các biểu thức toán học. Với ví dụ này, bạn sẽ áp dụng mọi thứ bạn đã học được từ 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 vào một vấn đề trong thế giới thực.

Hiểu về eval()

Bạn có thể sử dụng Python tích hợp eval() để đánh giá động các biểu thức từ đầu vào dựa trên chuỗi hoặc dựa trên mã đã biên dịch. Nếu bạn chuyển một chuỗi vào 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3, thì hàm sẽ phân tích cú pháp nó, biên dịch nó thành bytecode và đánh giá nó như một biểu thức Python. Nhưng nếu bạn gọi 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 với một đối tượng mã đã biên dịch, thì hàm chỉ thực hiện bước đánh giá, điều này khá thuận tiện nếu bạn gọi 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 nhiều lần với cùng một đầu vào.

Cú pháp của 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 như sau:

eval(expression[, globals[, locals]])

Hàm nhận một đối số đầu tiên là 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
5, chứa biểu thức mà bạn cần đánh giá. 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 cũng có hai đối số tùy chọn nữa:

  1. >>> # Arithmetic operations
    >>> code = compile("5 + 4", "", "eval")
    >>> eval(code)
    9
    >>> code = compile("(5 + 7) * 2", "", "eval")
    >>> eval(code)
    24
    >>> import math
    >>> # Volume of a sphere
    >>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
    >>> eval(code)
    65449.84694978735
    7
  2. >>> # Arithmetic operations
    >>> code = compile("5 + 4", "", "eval")
    >>> eval(code)
    9
    >>> code = compile("(5 + 7) * 2", "", "eval")
    >>> eval(code)
    24
    >>> import math
    >>> # Volume of a sphere
    >>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
    >>> eval(code)
    65449.84694978735
    8

Trong ba phần tiếp theo, bạn sẽ tìm hiểu những đối số này là gì và cách 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sử dụng chúng để đánh giá nhanh các biểu thức Python.

Lưu ý: Bạn cũng có thể sử dụng exec() để thực thi động mã Python. Sự khác biệt chính giữa eval() và exec() là eval() chỉ có thể thực thi hoặc đánh giá các biểu thức, trong khi exec() có thể thực thi bất kỳ đoạn mã Python nào.

Đối số đầu tiên: expression

Đây là đối số bắt buộc chứa đầu vào dựa trên chuỗi hoặc mã đã biên dịch cho hàm. Khi bạn gọi 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3, nội dung của 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
5 được đánh giá là một biểu thức Python. Kiểm tra các ví dụ sau sử dụng đầu vào dựa trên chuỗi:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200

Khi bạn gọi 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 với một chuỗi làm đối số, hàm sẽ trả về giá trị là kết quả từ việc đánh giá chuỗi đầu vào. Theo mặc định, 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 có quyền truy cập vào các tên chung như 
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
5 trong ví dụ trên.

Để đánh giá một chuỗi dựa trên 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
5, Python 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 chạy các bước sau:

  1. Phân tích cú pháp 
    >>> # Arithmetic operations
    >>> code = compile("5 + 4", "", "eval")
    >>> eval(code)
    9
    >>> code = compile("(5 + 7) * 2", "", "eval")
    >>> eval(code)
    24
    >>> import math
    >>> # Volume of a sphere
    >>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
    >>> eval(code)
    65449.84694978735
    5
  2. Biên dịch nó thành bytecode
  3. Đánh giá nó như một biểu thức Python
  4. Trả kết quả đánh giá

Tên 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
5 của đối số đầu tiên để 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 làm nổi bật rằng hàm chỉ hoạt động với các biểu thức chứ không phải với các câu lệnh ghép. Tài liệu Python định nghĩa expression như sau:

expression

Một đoạn cú pháp có thể được đánh giá thành một số giá trị. Nói cách khác, một biểu thức là một tập hợp các phần tử biểu thức như chữ, tên, quyền truy cập thuộc tính, toán tử hoặc lệnh gọi hàm mà tất cả đều trả về một giá trị. Ngược lại với nhiều ngôn ngữ khác, không phải tất cả các cấu trúc ngôn ngữ đều là biểu thức. Cũng có những câu lệnh không thể được sử dụng làm biểu thức, chẳng hạn như while. Phép gán cũng là câu lệnh, không phải là biểu thức. (Nguồn)

Mặt khác, một câu lệnh Python có định nghĩa sau:

câu lệnh

Một câu lệnh là một phần của bộ (một “khối” mã). Câu lệnh là một biểu thức hoặc một trong số các cấu trúc với từ khóa, chẳng hạn như if, while hoặc for. (Nguồn)

Nếu bạn cố gắng chuyển một câu lệnh ghép vào 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3, thì bạn sẽ nhận được một SyntaxError. Hãy xem ví dụ sau, trong đó bạn cố gắng thực thi một câu lệnh if bằng cách sử dụng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax

Nếu bạn cố gắng để đánh giá một câu lệnh ghép sử dụng Python 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3, sau đó bạn sẽ nhận được một 
>>> eval("x + y", {"x": x, "y": y})
300
5như ở trên traceback. Đó là bởi vì 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3chỉ chấp nhận các biểu thức. Bất kỳ lệnh nào, chẳng hạn như 
>>> eval("x + y", {"x": x, "y": y})
300
7, for, while, def, hay class, thì sẽ đều phát sinh lỗi.

Lưu ý: Một vòng lặp for là một câu lệnh ghép, nhưng từ khóa for cũng có thể được sử dụng trong comprehensions, được coi là biểu thức. Bạn có thể sử dụng eval() để đánh giá mức độ hiểu ngay cả khi chúng sử dụng từ khóa for.

Hoạt động chuyển nhượng không được phép với 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax

Nếu bạn cố gắng chuyển một thao tác gán làm đối số cho Python 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3, thì bạn sẽ nhận được một 
>>> eval("x + y", {"x": x, "y": y})
300
5. Các phép toán gán là các câu lệnh chứ không phải là các biểu thức và các câu lệnh không được phép với 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3.

Bạn cũng sẽ nhận được 

>>> eval("x + y", {"x": x, "y": y})
300
5bất kỳ lúc nào trình phân tích cú pháp không hiểu biểu thức đầu vào. Hãy xem ví dụ sau, trong đó bạn cố gắng đánh giá một biểu thức vi phạm cú pháp Python:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing

Bạn không thể truyền một biểu thức 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 vi phạm cú pháp Python. Trong ví dụ trên, bạn cố gắng đánh giá một biểu thức không đầy đủ (
>>> eval("x + y + z", {"x": x, "y": y, "z": 300})
600
>>> z
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'z' is not defined
6) và nhận được một SyntaxError vì trình phân tích cú pháp không hiểu cú pháp của biểu thức.

Bạn cũng có thể truyền các đối tượng mã đã biên dịch sang 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3. Để biên dịch mã mà bạn sẽ chuyển sang 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3, bạn có thể sử dụng compile(). Đây là một hàm tích hợp có thể biên dịch một chuỗi đầu vào thành một đối tượng mã hoặc một đối tượng AST để bạn có thể đánh giá nó với 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3.

Chi tiết về cách sử dụng 

>>> eval("sum([2, 2, 2])", {})
6
>>> eval("min([1, 2, 3])", {})
1
>>> eval("pow(10, 2)", {})
100
0 nằm ngoài phạm vi của hướng dẫn này, nhưng dưới đây là tóm tắt nhanh về ba đối số bắt buộc đầu tiên của nó:

  1. >>> eval("sum([2, 2, 2])", {})
    6
    >>> eval("min([1, 2, 3])", {})
    1
    >>> eval("pow(10, 2)", {})
    100
    1 giữ mã nguồn mà bạn muốn biên dịch. Đối số này chấp nhận các chuỗi bình thường, chuỗi byte và các đối tượng AST.
  2. >>> eval("sum([2, 2, 2])", {})
    6
    >>> eval("min([1, 2, 3])", {})
    1
    >>> eval("pow(10, 2)", {})
    100
    2 cung cấp cho tệp mà từ đó mã đã được đọc. Nếu bạn định sử dụng đầu vào dựa trên chuỗi, thì giá trị cho đối số này phải là 
    >>> eval("sum([2, 2, 2])", {})
    6
    >>> eval("min([1, 2, 3])", {})
    1
    >>> eval("pow(10, 2)", {})
    100
    3.
  3. >>> eval("sum([2, 2, 2])", {})
    6
    >>> eval("min([1, 2, 3])", {})
    1
    >>> eval("pow(10, 2)", {})
    100
    4 chỉ định loại mã đã biên dịch mà bạn muốn lấy. Nếu bạn muốn xử lý mã đã biên dịch với 
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    3, thì đối số này phải được đặt thành 
    >>> eval("sum([2, 2, 2])", {})
    6
    >>> eval("min([1, 2, 3])", {})
    1
    >>> eval("pow(10, 2)", {})
    100
    6.

Bạn có thể sử dụng 

>>> eval("sum([2, 2, 2])", {})
6
>>> eval("min([1, 2, 3])", {})
1
>>> eval("pow(10, 2)", {})
100
0 để cung cấp các đối tượng mã 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 thay vì các chuỗi bình thường. Kiểm tra các ví dụ sau:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735

Nếu bạn sử dụng 

>>> eval("sum([2, 2, 2])", {})
6
>>> eval("min([1, 2, 3])", {})
1
>>> eval("pow(10, 2)", {})
100
0 để biên dịch các biểu thức mà bạn sẽ chuyển sang 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3, hãy thực hiện 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 theo các bước sau:

  1. Đánh giá mã đã biên dịch
  2. Trả kết quả đánh giá

Nếu bạn gọi 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 bằng cách sử dụng đầu vào dựa trên mã đã biên dịch, thì hàm sẽ thực hiện bước đánh giá và ngay lập tức trả về kết quả. Điều này có thể hữu ích khi bạn cần đánh giá cùng một biểu thức nhiều lần. Trong trường hợp này, tốt nhất bạn nên biên dịch trước biểu thức và sử dụng lại mã bytecode kết quả trong các lần gọi 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 tiếp theo.

Nếu bạn biên dịch trước biểu thức đầu vào, thì các lệnh gọi liên tiếp tới 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sẽ chạy nhanh hơn vì bạn sẽ không lặp lại các bước phân tích cú pháp và biên dịch. Việc lặp lại không cần thiết có thể dẫn đến thời gian CPU cao và tiêu thụ quá nhiều bộ nhớ nếu bạn đang đánh giá các biểu thức phức tạp.

Đối sô thứ hai: globals

Đối số thứ hai của 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 được gọi là 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7. Nó là tùy chọn và chứa một từ điển cung cấp không gian tên chung cho 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3. Với 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7, bạn có thể cho 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 biết những tên chung nào cần sử dụng trong khi đánh giá 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
5.

Tên chung là tất cả những tên có sẵn trong phạm vi toàn cầu hoặc không gian tên hiện tại của bạn. Bạn có thể truy cập chúng từ bất kỳ đâu trong mã của mình.

Tất cả các tên được chuyển đến 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 trong từ điển sẽ có sẵn 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 tại thời điểm thực thi. Hãy xem ví dụ sau, ví dụ này cho thấy cách sử dụng từ điển tùy chỉnh để cung cấp không gian tên chung cho 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined

Nếu bạn cung cấp một từ điển tùy chỉnh cho đối số 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 của 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3, thì 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sẽ chỉ lấy những tên đó làm các giá trị có phạm vi toàn cục. Mọi tên chung được xác định bên ngoài từ điển tùy chỉnh này sẽ không thể truy cập được từ bên trong 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3. Đó là lý do tại sao Python phát sinh một lỗi 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
10 khi bạn cố gắng truy cập 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
11 trong đoạn code trên: Từ điển được chuyển đến 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 không bao gồm 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
11.

Bạn có thể chèn tên vào 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 bằng cách liệt kê chúng trong từ điển của mình và sau đó những tên đó sẽ có sẵn trong quá trình đánh giá. Ví dụ: nếu bạn chèn 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
11 vào 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7, thì đánh giá 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
17 trong ví dụ trên sẽ hoạt động như mong đợi:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> eval("x + y", {"x": x, "y": y})
300

Vì bạn thêm 

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
11 vào từ điển 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 tùy chỉnh của mình, nên việc đánh giá 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
17 sẽ thành công và bạn nhận được giá trị trả về mong đợi là 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
22.

Bạn cũng có thể cung cấp các tên không tồn tại trong phạm vi toàn cục hiện tại của bạn. Để điều này hoạt động, bạn cần cung cấp một giá trị cụ thể cho mỗi một tên. 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sẽ diễn giải những tên này là tên chung khi chạy:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> eval("x + y + z", {"x": x, "y": y, "z": 300})
600
>>> z
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'z' is not defined

Mặc dù 

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
25 không được xác định trong phạm vi toàn cục hiện tại của bạn, nhưng biến vẫn hiện diện trong 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 với giá trị là 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
22. Trong trường hợp này, 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 có quyền truy cập 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
25 như thể nó là một biến toàn cục.

Cơ chế đằng sau 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 khá linh hoạt. Bạn có thể truyền bất kỳ biến hiển thị nào (toàn cục, cục bộ hoặc phi cục bộ) đến 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7. Bạn cũng có thể truyền các cặp khóa-giá trị tùy chỉnh như 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
32 trong ví dụ trên. 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sẽ coi tất cả chúng là biến toàn cục.

Một điểm quan trọng liên quan đến 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 là nếu bạn cung cấp một từ điển tùy chỉnh cho nó mà không chứa giá trị cho khóa 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
35, thì một tham chiếu đến từ điển của builtins sẽ được tự động chèn vào 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
35 trước khi 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
5 được phân tích cú pháp. Điều này đảm bảo rằng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sẽ có toàn quyền truy cập vào tất cả các tên được tích hợp sẵn của Python khi đánh giá 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
5.

Các ví dụ sau đây cho thấy rằng ngay cả khi bạn cung cấp một từ điển trống 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7, thì lệnh gọi tới 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 vẫn có quyền truy cập vào các tên có sẵn của Python:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> eval("sum([2, 2, 2])", {})
6
>>> eval("min([1, 2, 3])", {})
1
>>> eval("pow(10, 2)", {})
100

Trong đoạn mã trên, bạn cung cấp một từ điển trống (

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
43) cho 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7. Vì từ điển đó không chứa một khóa gọi là 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
35, nên Python sẽ tự động chèn một khóa có tham chiếu đến các tên trong 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
46. Bằng cách này, 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 có toàn quyền truy cập vào tất cả các tên có sẵn của Python khi nó phân tích cú pháp 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
5.

Nếu bạn gọi 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 mà không chuyển từ điển tùy chỉnh đến 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7, thì đối số sẽ mặc định là từ điển được trả về 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
51 trong môi trường 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 được gọi là:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> x = 100  # A global variable
>>> y = 200  # Another global variable
>>> eval("x + y")  # Access both global variables
300

Khi bạn gọi 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3mà không cung cấp đối số 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7, thì hàm sẽ đánh giá 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
5 bằng cách sử dụng từ điển được trả về bởi 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
51 dưới dạng không gian tên chung của nó. Vì vậy, trong ví dụ trên, bạn có thể tự do truy cập 
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
5 và 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
11 vì chúng là các biến toàn cục được đưa vào phạm vi toàn cục hiện tại của bạn.

Đối số thứ ba: locals

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sử dụng một đối số thứ ba được gọi 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8. Đây là một đối số tùy chọn khác chứa từ điển. Trong trường hợp này, từ điển chứa các biến được 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sử dụng làm tên cục bộ khi đánh giá 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
5.

Tên cục bộ là những tên (biến, hàm, lớp, v.v.) mà bạn tạo bên trong một hàm nhất định. Tên cục bộ chỉ hiển thị từ bên trong hàm bao quanh. Bạn tạo những loại tên này khi bạn viết một hàm.

Vì 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 đã được viết sẵn, nên bạn không thể thêm tên cục bộ vào mã hoặc phạm vi cục bộ của nó. Tuy nhiên, bạn có thể truyền từ điển vào 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8 và 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sẽ coi những tên đó là tên cục bộ:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
0

Từ điển thứ hai trong lần gọi đầu tiên để cho 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 giữ biến 
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
5. Biến này được 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 hiểu là một biến cục bộ. Nói cách khác, nó được xem như một biến được định nghĩa trong phần thân của 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3.

Bạn có thể sử dụng 

>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
5 trong 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
5 và 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sẽ có quyền truy cập vào nó. Ngược lại, nếu bạn cố gắng sử dụng 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
11, thì bạn sẽ nhận được 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
10 bởi vì 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
11 không được tạo ra cả trong không gian tên 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 lẫn không gian tên 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8.

Giống như với 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7, bạn có thể truyền bất kỳ biến hiển thị nào (toàn cục, cục bộ hoặc không cục bộ) đến 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8. Bạn cũng có thể truyền các cặp khóa-giá trị tùy chỉnh như 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
82 trong ví dụ trên. 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sẽ coi tất cả chúng là biến cục bộ.

Lưu ý rằng để cung cấp từ điển cho 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8, trước tiên bạn cần cung cấp từ điển cho 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7. Không thể sử dụng các đối số từ khóa với 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
1

Nếu bạn cố gắng sử dụng các đối số từ khóa khi gọi 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3, thì bạn sẽ nhận được lỗi 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
89 với giải thích rằng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 không có đối số từ khóa. Vì vậy, bạn cần cung cấp từ điển 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 trước khi có thể cung cấp từ điển 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8.

Nếu bạn không chuyển một từ điển đến 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8, thì nó sẽ mặc định là từ điển được chuyển đến 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7. Đây là một ví dụ trong đó bạn chuyển một từ điển trống 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7và không có gì vào 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
2

Giả sử rằng bạn không cung cấp từ điển tùy chỉnh 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8, đối số sẽ mặc định được chuyển đến từ điển 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7. Trong trường hợp này, 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 không có quyền truy cập vào 
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
5 vì 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 có một từ điển trống.

Sự khác biệt thực tế chính giữa 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 và 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8 là Python sẽ tự động chèn một từ khóa 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
35 vào 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 nếu khóa đó chưa tồn tại. Điều này xảy ra cho dù bạn có cung cấp từ điển tùy chỉnh cho 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 hay không. Mặt khác, nếu bạn cung cấp một từ điển tùy chỉnh cho 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8, thì từ điển đó sẽ không thay đổi trong quá trình thực thi 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3.

Đánh giá biểu thức bằng eval()

Bạn có thể sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 để đánh giá bất kỳ loại biểu thức Python nào nhưng không phải là các câu lệnh Python, chẳng hạn như câu lệnh ghép dựa trên từ khóa hoặc câu lệnh gán.

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 có thể hữu ích khi bạn cần đánh giá động các biểu thức và sử dụng các kỹ thuật hoặc công cụ Python khác sẽ làm tăng đáng kể thời gian và nỗ lực phát triển của bạn. Trong phần này, bạn sẽ học cách sử dụng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 để đánh giá Boolean, toán học và các biểu thức Python có mục đích chung.

Biểu thức Boolean

Biểu thức Boolean là các biểu thức Python trả về giá trị chân lý (

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
13 hoặc 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
14) khi trình thông dịch đánh giá chúng. Chúng thường được sử dụng trong các câu lệnh if để kiểm tra xem một số điều kiện là đúng hay sai. Vì biểu thức Boolean không phải là câu lệnh ghép nên bạn có thể sử dụng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3để đánh giá chúng:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
3

Bạn có thể sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 với các biểu thức Boolean sử dụng bất kỳ loại phép toán Python nào sau đây:

  • Phép toán so sánh: 
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    18,
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    19,
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    20,
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    21,
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    22,
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    23
  • Phép toán logic: 
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    24, 
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    25, 
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    26
  • Phép toán kiểm tra thành viên: 
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    27, 
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    28
  • Phép toán nhận diện: is, is not

Trong mọi trường hợp, hàm sẽ đều trả về giá trị chân lý của biểu thức mà bạn đang đánh giá.

Bây giờ, bạn có thể đang nghĩ, tại sao tôi nên sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 thay vì sử dụng trực tiếp biểu thức Boolean? Vâng, giả sử bạn cần triển khai một câu lệnh có điều kiện, nhưng bạn muốn thay đổi điều kiện một cách nhanh chóng như sau:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
4

Thì bên trong 

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
31, bạn sử dụng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 để đánh giá sản phẩm được cung cấp 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
33 và trả về 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
34 hoặc 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
35 theo kết quả đánh giá. Bạn chỉ sử dụng một vài điều kiện khác nhau trong ví dụ trên, nhưng bạn có thể sử dụng bất kỳ số điều kiện nào khác với điều kiện bạn phải tuân theo với các tên 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
36 và 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
37 mà bạn đã định nghĩa trong 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
31.

Bây giờ hãy tưởng tượng bạn sẽ triển khai thứ gì đó như thế này mà không cần sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3. Điều đó có tốn ít code và thời gian hơn không? Chắc chắn là không!

Biểu thức toán học

Một trường hợp sử dụng phổ biến nữa của 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 là đánh giá các biểu thức toán học từ đầu vào dựa trên chuỗi. Ví dụ: nếu bạn muốn tạo một máy tính Python, thì bạn có thể sử dụng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 để đánh giá đầu vào của người dùng và trả về kết quả của các phép tính.

Các ví dụ sau đây cho thấy cách bạn có thể sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 cùng với math để thực hiện các phép toán:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
5

Khi bạn sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 để đánh giá các biểu thức toán học, bạn có thể chuyển các biểu thức thuộc bất kỳ loại hoặc độ phức tạp nào. 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sẽ phân tích cú pháp, đánh giá chúng và nếu mọi thứ đều ổn, sẽ cho bạn kết quả như mong đợi.

Biểu thức Mục đích Chung

Đến đây thì bạn đã học cách sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 với Boolean và các biểu thức toán học. Tuy nhiên, bạn có thể sử dụng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 với các biểu thức Python phức tạp hơn kết hợp các lệnh gọi hàm, tạo đối tượng, truy cập thuộc tính, comprehension, v.v.

Ví dụ: bạn có thể gọi một hàm tích hợp sẵn hoặc một hàm mà bạn đã nhập bằng mô-đun chuẩn hoặc bên thứ ba:

>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
6

Trong ví dụ này, bạn sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 để thực hiện một số lệnh hệ thống. Như bạn có thể tưởng tượng, bạn có thể làm rất nhiều điều hữu ích với tính năng này. Tuy nhiên, 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 cũng có thể khiến bạn gặp phải những rủi ro bảo mật nghiêm trọng, chẳng hạn như cho phép người dùng độc hại chạy các lệnh hệ thống hoặc bất kỳ đoạn mã tùy ý nào trong máy của bạn.

Trong phần tiếp theo, bạn sẽ xem xét các cách để giải quyết một số rủi ro bảo mật liên quan đến eval().

Giảm thiểu các vấn đề bảo mật của eval()

Mặc dù nó có số lượng sử dụng gần như không giới hạn, nhưng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 cũng có ý nghĩa bảo mật quan trọng. 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 được coi là không an toàn vì nó cho phép bạn (hoặc người dùng của bạn) thực thi động mã Python tùy ý.

Đây được coi là thực tế lập trình tồi vì mã bạn đang đọc (hoặc viết) không phải là mã bạn sẽ thực thi. Nếu bạn định sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 để đánh giá đầu vào từ người dùng hoặc bất kỳ nguồn bên ngoài nào khác, thì bạn sẽ không biết chắc chắn mã nào sẽ được thực thi. Đó là một rủi ro bảo mật nghiêm trọng nếu ứng dụng của bạn chạy không đúng người.

Vì lý do này, các phương pháp lập trình tốt thường khuyên bạn không nên sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3. Nhưng nếu bạn vẫn chọn sử dụng hàm, thì nguyên tắc chung là không bao giờ  sử dụng nó với đầu vào không đáng tin cậy. Phần khó của quy tắc này là tìm ra loại đầu vào nào bạn có thể tin tưởng.

Ví dụ về cách sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 thiếu trách nhiệm có thể làm cho mã của bạn không an toàn, giả sử bạn muốn xây dựng một dịch vụ trực tuyến để đánh giá các biểu thức Python tùy ý. Người dùng của bạn sẽ giới thiệu các biểu thức và sau đó nhấp vào nút 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
56. Ứng dụng sẽ lấy thông tin đầu vào của người dùng và chuyển nó đến 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 để đánh giá.

Ứng dụng này sẽ chạy trên máy chủ cá nhân của bạn, nơi bạn có tất cả các tệp có giá trị đó. Nếu bạn đang chạy một box Linux và quy trình của ứng dụng có quyền phù hợp, thì người dùng độc hại có thể đưa ra một chuỗi nguy hiểm như sau:

>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
7

Đoạn mã trên sẽ xóa tất cả các tệp trong thư mục hiện tại của ứng dụng. Điều đó sẽ thật kinh khủng, phải không?

Lưu ý: __import__() là một hàm dựng sẵn lấy tên mô-đun làm chuỗi và trả về một tham chiếu đến đối tượng mô-đun. __import__() là một hàm, hoàn toàn khác với câu lệnh import. Bạn không thể đánh giá một lệnh import bằng cách sử dụng eval().

Khi đầu vào không đáng tin cậy, không có cách nào hoàn toàn hiệu quả để tránh các rủi ro bảo mật liên quan đến 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3. Tuy nhiên, bạn có thể giảm thiểu rủi ro của mình bằng cách hạn chế môi trường thực thi của 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3. Bạn sẽ học một số kỹ thuật để làm như vậy trong các phần sau.

Hạn chế của globals và locals

Bạn có thể hạn chế môi trường thực thi 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 bằng cách truyền các từ điển tùy chỉnh đến các đối số 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 và 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8. Ví dụ: bạn có thể truyền các từ điển trống cho cả hai đối số để ngăn việc 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 truy cập các tên trong phạm vi hoặc không gian tên hiện tại của người gọi:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
8

Nếu bạn truyền từ điển trống (

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
43) đến 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 và 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8, thì 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sẽ không tìm thấy tên 
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
5 trong không gian tên chung hoặc không gian tên cục bộ của nó khi đánh giá chuỗi 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
71. Kết quả là, 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sẽ ném một 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
10.

Thật không may, việc hạn chế các đối số 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 và 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8 như thế này không loại bỏ tất cả các rủi ro bảo mật liên quan đến việc sử dụng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3, vì bạn vẫn có thể truy cập vào tất cả các tên có sẵn của Python.

Hạn chế sử dụng tên có sẵn

Như bạn đã thấy trước đó, 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sẽ tự động chèn một tham chiếu đến từ điển của 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
46 vào 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 trước khi phân tích cú pháp 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
5. Người dùng độc hại có thể khai thác hành vi này bằng cách sử dụng hàm có sẵn 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
81 để có quyền truy cập vào thư viện chuẩn và bất kỳ mô-đun bên thứ ba nào mà bạn đã cài đặt trên hệ thống của mình.

Các ví dụ sau cho thấy rằng bạn có thể sử dụng bất kỳ hàm tích hợp nào và bất kỳ mô-đun tiêu chuẩn nào như 

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
82 hoặc 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
83 thậm chí sau khi bạn đã hạn chế 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 và 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
9

Mặc dù bạn hạn chế 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 và 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8 sử dụng các từ điển trống, bạn vẫn có thể sử dụng bất kỳ chức năng tích hợp nào giống như bạn đã làm với 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
89 và 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
81 trong đoạn mã trên.

Bạn có thể sử dụng 

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
81 để nhập bất kỳ mô-đun tiêu chuẩn hoặc bên thứ ba nào giống như bạn đã làm ở trên với 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
82 và 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
83. Với kỹ thuật này, bạn có thể truy cập vào bất kỳ hàm hoặc lớp được định nghĩa nào trong 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
82, 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
83 hoặc bất kỳ thành phần khác. Bây giờ hãy tưởng tượng những gì một người dùng độc hại có thể làm với hệ thống của bạn bằng cách sử dụng 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
83 hoặc bất kỳ mô-đun mạnh mẽ nào khác trong thư viện chuẩn.

Để giảm thiểu rủi ro này, bạn có thể hạn chế quyền truy cập vào các chức năng tích hợp của Python bằng cách ghi đè khóa 

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
35 trong 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7. Thực tiễn tốt khuyên bạn nên sử dụng từ điển tùy chỉnh có chứa cặp khóa-giá trị 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
99. Kiểm tra ví dụ sau:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
0

Nếu bạn truyền một từ điển có chứa cặp khóa-giá trị 

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
99 vào 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7, thì 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 sẽ không có quyền truy cập trực tiếp vào các hàm tích hợp sẵn của Python như 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
81. Tuy nhiên, như bạn sẽ thấy trong phần tiếp theo, cách tiếp cận này vẫn không đảm bảo 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 hoàn toàn an toàn.

Hạn chế tên khi input dữ liệu

Mặc dù bạn có thể hạn chế môi trường thực thi của Python 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 bằng cách sử dụng tùy chỉnh các từ điển 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 và 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8, nhưng eval() vẫn sẽ dễ bị tấn công bởi một vài thủ thuật lạ. Ví dụ, bạn có thể truy cập vào lớp 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
09 sử dụng một loại Literal như 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
10, 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
11, 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
43, hoặc 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
13 cùng với một số thuộc tính đặc biệt như sau:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
1

Khi bạn có quyền truy cập 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
09, bạn có thể sử dụng phương thức đặc biệt là .__subclasses__() để truy cập vào tất cả các lớp kế thừa từ lớp 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
09. Đây là cách nó hoạt động:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
2

Mã này sẽ in một danh sách lớn các lớp ra màn hình của bạn. Một số lớp này khá mạnh và có thể cực kỳ nguy hiểm khi rơi vào tay kẻ xấu. Điều này mở ra một lỗ hổng bảo mật quan trọng khác mà bạn không thể đóng bằng cách hạn chế môi trường thực thi của 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
3

Sự hiểu danh sách trong đoạn mã trên lọc các lớp kế thừa 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
09 để trả về một lớp 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
21 chứa range. Chỉ mục đầu tiên (
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
22) trả về lớp 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
23. Khi bạn có quyền truy cập 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
23, bạn gọi nó để tạo một đối tượng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
23. Sau đó, bạn gọi 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
26 trên đối tượng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
23 để tạo ra một danh sách gồm 10 số nguyên.

Trong ví dụ này, bạn sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
23 để minh họa một lỗ hổng bảo mật 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3. Bây giờ hãy tưởng tượng những gì một người dùng độc hại có thể làm nếu hệ thống của bạn tiếp xúc với các lớp như subprocess.Popen.

Một giải pháp khả thi cho lỗ hổng này là hạn chế việc sử dụng tên trong đầu vào, với một loạt các tên an toàn hoặc không có tên nào cả. Để thực hiện kỹ thuật này, bạn cần trải qua các bước sau:

  1. Tạo một từ điển chứa các tên mà bạn muốn sử dụng với 
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    3.
  2. Biên dịch chuỗi đầu vào thành bytecode bằng cách sử dụng 
    >>> eval("sum([2, 2, 2])", {})
    6
    >>> eval("min([1, 2, 3])", {})
    1
    >>> eval("pow(10, 2)", {})
    100
    0 trong chế độ 
    >>> eval("sum([2, 2, 2])", {})
    6
    >>> eval("min([1, 2, 3])", {})
    1
    >>> eval("pow(10, 2)", {})
    100
    6.
  3. Kiểm tra 
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    33 trên đối tượng bytecode để đảm bảo rằng nó chỉ chứa các tên được phép.
  4. Kích hoạt 
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    10 nếu người dùng cố gắng nhập tên không được phép.

Hãy xem hàm sau đây:

>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
4

Trong 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
36, bạn thực hiện tất cả các bước. Hàm này sẽ hạn chế các tên mà bạn có thể sử dụng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 chỉ với những tên đó trong từ điển 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
38. Để làm điều này, hàm sử dụng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
33, là một thuộc tính của một đối tượng mã trả về một bộ giá trị chứa các tên trong đối tượng mã.

Các ví dụ sau đây cho thấy cách 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
36 hoạt động trong thực tế:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
5

Nếu bạn gọi 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
36 để đánh giá các phép toán số học hoặc nếu bạn sử dụng các biểu thức bao gồm các tên được phép, thì bạn sẽ nhận được kết quả mong đợi. Nếu không, bạn sẽ nhận được một 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
10. Trong các ví dụ trên, tên duy nhất bạn cho phép là 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
89. Các tên khác như 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
45 và 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
46 sẽ không được phép, vì vậy hàm sẽ phát sinh lỗi 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
10 khi bạn cố gắng sử dụng chúng.

Nếu bạn muốn hoàn toàn không cho phép sử dụng tên, bạn có thể viết lại 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
36 như sau:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6

Bây giờ hàm của bạn sẽ không cho phép bất kỳ tên nào trong chuỗi đầu vào. Để thực hiện điều này, bạn kiểm tra tên trong 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
33 và kích hoạt một 
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
10 nếu tìm thấy. Nếu không, bạn đánh giá 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
52 và trả về kết quả đánh giá. Trong trường hợp này, bạn cũng sử dụng một từ điển trống để hạn chế 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8.

Bạn có thể sử dụng kỹ thuật này để giảm thiểu các vấn đề bảo mật 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 và củng cố khả năng bảo vệ của mình trước các cuộc tấn công độc hại.

Hạn chế input dữ liệu là các hằng

Một trường hợp sử dụng phổ biến cho 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 là đánh giá các chuỗi có chứa các ký tự Python tiêu chuẩn và biến chúng thành các đối tượng cụ thể.

Thư viện tiêu chuẩn cung cấp một hàm được gọi là literal_eval() có thể giúp đạt được mục tiêu này. Hàm không hỗ trợ toán tử, nhưng nó hỗ trợ list, tuple, số, chuỗi, v.v.

>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7

Lưu ý rằng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
57 chỉ hoạt động với các ký tự kiểu tiêu chuẩn. Nó không hỗ trợ việc sử dụng các toán tử hoặc tên. Nếu bạn cố gắng cung cấp một biểu thức cho 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
57, thì bạn sẽ nhận được một lỗi 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
59. Hàm này cũng có thể giúp bạn giảm thiểu rủi ro bảo mật liên quan đến việc sử dụng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3.

Sử dụng eval() với input()

Trong Python 3.x có tích hợp sẵn input() dùng để đọc dữ liệu đầu vào của người dùng tại dòng lệnh, chuyển đổi nó thành một chuỗi, tách dòng mới ở cuối và trả về kết quả cho người gọi. Vì kết quả của 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
61 là một chuỗi, bạn có thể cung cấp 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 và đánh giá nó như một biểu thức Python:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
8

Bạn có thể đặt 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 ngoài 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
61 để tự động đánh giá đầu vào của người dùng. Đây là một trường hợp sử dụng phổ biến của 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 vì nó mô phỏng hành vi của input() trong Python 2.x, trong đó 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
61 đánh giá đầu vào của người dùng dưới dạng biểu thức Python và trả về kết quả.

Hành vi này của 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
61 trong Python 2.x đã được thay đổi trong Python 3.x vì các tác động bảo mật của nó.

Xây dựng một trình đánh giá biểu thức toán học

Đến đây thì bạn đã biết cách 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 hoạt động và cách sử dụng nó trong thực tế. Bạn cũng đã biết rằng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 có thể gây ra lỗ hổng bảo mật nghiêm trọng. Tuy nhiên, bên cạnh đó 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 có thể giúp bạn tiết kiệm rất nhiều thời gian và công sức.

Trong phần này, bạn sẽ viết mã một ứng dụng để đánh giá nhanh các biểu thức toán học. Nếu bạn muốn giải quyết vấn đề này mà không cần sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3, thì bạn cần thực hiện các bước sau:

  1. Phân tích cú pháp biểu thức đầu vào.
  2. Thay đổi các thành phần của biểu thức thành các đối tượng Python (số, toán tử, hàm, v.v.).
  3. Kết hợp mọi thứ thành một biểu thức.
  4. Xác nhận rằng biểu thức hợp lệ trong Python.
  5. Đánh giá biểu thức cuối cùng và trả về kết quả.

Đó sẽ là rất nhiều công việc xem xét nhiều loại biểu thức có thể có mà Python có thể xử lý và đánh giá. May mắn thay, bạn có thể sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 để giải quyết vấn đề này và bạn đã học được một số kỹ thuật để giảm các rủi ro bảo mật liên quan.

Đầu tiên bạn tạo một file tên 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
74, sau đó thêm mã sau:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
9

Trong đoạn mã trên, trước tiên bạn import mô-đun 

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
82 của Python. Mô-đun này sẽ cho phép bạn thực hiện các phép toán bằng cách sử dụng các hàm và hằng số được xác định trước. Hằng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
77 chứa một từ điển chứa các tên không đặc biệt trong 
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
82. Bằng cách này, bạn sẽ có thể sử dụng chúng với 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3.

Bạn cũng tạo thêm ba hằng số chuỗi. Bạn sẽ sử dụng chúng làm giao diện người dùng cho tập lệnh của mình và bạn sẽ in chúng ra màn hình nếu cần.

Bây giờ bạn đã sẵn sàng để viết mã chức năng cốt lõi của ứng dụng của mình. Trong trường hợp này, bạn muốn viết mã một hàm nhận các biểu thức toán học làm đầu vào và trả về kết quả của chúng. Để làm điều này, bạn viết một hàm có tên 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
80:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
0

Đây là cách hoạt động của hàm:

  1. Dòng 
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    82, bạn định nghĩa hàm 
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    80. Hàm này có chuỗi 
    >>> # Arithmetic operations
    >>> code = compile("5 + 4", "", "eval")
    >>> eval(code)
    9
    >>> code = compile("(5 + 7) * 2", "", "eval")
    >>> eval(code)
    24
    >>> import math
    >>> # Volume of a sphere
    >>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
    >>> eval(code)
    65449.84694978735
    5 làm tham số và hàm trả về kiểu float đại diện là kết quả của việc đánh giá chuỗi như một biểu thức toán học.
  2. Dòng 
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    85, bạn sử dụng 
    >>> eval("sum([2, 2, 2])", {})
    6
    >>> eval("min([1, 2, 3])", {})
    1
    >>> eval("pow(10, 2)", {})
    100
    0 để biến chuỗi đầu vào 
    >>> # Arithmetic operations
    >>> code = compile("5 + 4", "", "eval")
    >>> eval(code)
    9
    >>> code = compile("(5 + 7) * 2", "", "eval")
    >>> eval(code)
    24
    >>> import math
    >>> # Volume of a sphere
    >>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
    >>> eval(code)
    65449.84694978735
    5 thành mã Python đã biên dịch. Thao tác biên dịch sẽ phát sinh một lỗi 
    >>> eval("x + y", {"x": x, "y": y})
    300
    5 nếu người dùng nhập một biểu thức không hợp lệ.
  3. Dòng 
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    89, bạn bắt đầu một vòng lặp 
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    90 để kiểm tra các tên có trong 
    >>> # Arithmetic operations
    >>> code = compile("5 + 4", "", "eval")
    >>> eval(code)
    9
    >>> code = compile("(5 + 7) * 2", "", "eval")
    >>> eval(code)
    24
    >>> import math
    >>> # Volume of a sphere
    >>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
    >>> eval(code)
    65449.84694978735
    5 và xác nhận rằng chúng có thể được sử dụng trong biểu thức cuối cùng. Nếu người dùng cung cấp tên không có trong danh sách tên được phép thì ta sẽ nhận được một lỗi 
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    10.
  4. Dòng 
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    93, bạn thực hiện đánh giá thực tế của biểu thức toán học. Lưu ý rằng bạn chuyển các từ điển tùy chỉnh đến 
    >>> # Arithmetic operations
    >>> code = compile("5 + 4", "", "eval")
    >>> eval(code)
    9
    >>> code = compile("(5 + 7) * 2", "", "eval")
    >>> eval(code)
    24
    >>> import math
    >>> # Volume of a sphere
    >>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
    >>> eval(code)
    65449.84694978735
    7 và 
    >>> # Arithmetic operations
    >>> code = compile("5 + 4", "", "eval")
    >>> eval(code)
    9
    >>> code = compile("(5 + 7) * 2", "", "eval")
    >>> eval(code)
    24
    >>> import math
    >>> # Volume of a sphere
    >>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
    >>> eval(code)
    65449.84694978735
    8 như phương pháp hay được khuyến nghị. 
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    77 giữ các hàm và hằng số được định nghĩa trong 
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    82.

Lưu ý: Vì ứng dụng này sử dụng các hàm được định nghĩa trong math, bạn cần phải xem xét rằng một số hàm này sẽ phát sinh một lỗi ValueError khi bạn gọi chúng với giá trị đầu vào không hợp lệ.

Ví dụ, math.sqrt(-10) sẽ phát sinh lỗi vì căn bậc hai của -10 không được xác định. Sau đó, bạn sẽ thấy cách bắt lỗi này trong mã khách hàng của mình.

Việc sử dụng các giá trị tùy chỉnh cho các tham số 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
7 và 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
8 cùng với việc kiểm tra các tên trong dòng 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
00 sẽ cho phép bạn giảm thiểu các rủi ro bảo mật liên quan đến việc sử dụng 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3.

Trình đánh giá biểu thức toán học của bạn sẽ hoàn thành khi bạn viết mã khách hàng của nó vào main(). Trong hàm này, bạn sẽ tạo vòng lặp chính của chương trình và đóng chu kỳ đọc và đánh giá các biểu thức mà người dùng của bạn nhập vào dòng lệnh.

Đối với ví dụ này, ứng dụng sẽ:

  1. In thông báo chào mừng tới người dùng
  2. Hiển thị lời nhắc sẵn sàng đọc thông tin đầu vào của người dùng
  3. Cung cấp các tùy chọn để nhận hướng dẫn sử dụng và chấm dứt ứng dụng
  4. Đọc biểu thức toán học của người dùng
  5. Đánh giá biểu thức toán học của người dùng
  6. In kết quả đánh giá ra màn hình

Kiểm tra việc triển khai sau đây của 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
02:
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
1

Bên trong 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
02, trước tiên bạn in thông điệp 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
05. Sau đó, bạn đọc đầu vào của người dùng trong một câu lệnh try để bắt các ngoại lệ 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
06 và 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
07. Nếu một trong hai trường hợp ngoại lệ này xảy ra, thì bạn chấm dứt ứng dụng.

Nếu người dùng nhập tùy chọn 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
08, thì ứng dụng sẽ hiển thị hướng dẫn 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
09. Tương tự như vậy, nếu người dùng nhập 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
10 hoặc 
>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
11, thì ứng dụng sẽ kết thúc.

Cuối cùng, bạn sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
80 để đánh giá biểu thức toán học của người dùng, và sau đó bạn in kết quả ra màn hình. Điều quan trọng cần lưu ý là một lời gọi đến 
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
80 có thể đưa ra các trường hợp ngoại lệ sau:

  • >>> eval("x + y", {"x": x, "y": y})
    300
    5: Điều này xảy ra khi người dùng nhập một biểu thức không tuân theo cú pháp Python.
  • >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    10: Điều này xảy ra khi người dùng cố gắng sử dụng tên (hàm, lớp hoặc thuộc tính) không được phép.
  • >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    59: Điều này xảy ra khi người dùng cố gắng sử dụng một giá trị không được phép làm đầu vào cho một hàm nhất định trong 
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    82.

Lưu ý rằng trong 

>>> # Arithmetic operations
>>> code = compile("5 + 4", "", "eval")
>>> eval(code)
9
>>> code = compile("(5 + 7) * 2", "", "eval")
>>> eval(code)
24
>>> import math
>>> # Volume of a sphere
>>> code = compile("4 / 3 * math.pi * math.pow(25, 3)", "", "eval")
>>> eval(code)
65449.84694978735
02, bạn nắm bắt tất cả các ngoại lệ này và in thông báo cho người dùng biết lỗi tương ứng là gì. Điều này sẽ cho phép người dùng xem lại biểu thức, khắc phục sự cố và chạy lại chương trình.

Như vậy đến đây bạn đã xây dựng xong một trình đánh giá biểu thức toán học trong khoảng bảy mươi dòng mã bằng cách sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3. Dưới đây là chương trình hoàn chỉnh:

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
2

Bạn chạy chương trình sẽ hiện ra kết quả thế này:

MathREPL 1.0, trình đánh giá biểu thức toán học Python!Nhập vào một biểu thức toán học sau dòng nhắc "mr>>".Soạn "help" rồi Enter để biết thêm thông tin.Soạn "quit" hoặc "exit" để thoát.
Nhập vào một biểu thức toán học sau dòng nhắc "mr>>".
Soạn "help" rồi Enter để biết thêm thông tin.
Soạn "quit" hoặc "exit" để thoát.

mr>> 

Bạn thực hiện một số ví dụ như sau xem sao:

>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

mr>> 9*5Kết quả: 45mr>> sqrt(9)Kết quả: 3.0mr>> sqrt(-9)math domain errormr>> sqrt(81Cú pháp biểu thức đưa vào không hợp lệmr>> 

>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2
Kết quả: 45
mr>> sqrt(9)
Kết quả: 3.0
mr>> sqrt(-9)
math domain error
mr>> sqrt(81
Cú pháp biểu thức đưa vào không hợp lệ
mr>> 
>>> x = 100  # A global variable
>>> eval("x + 100", {"x": x})
200
>>> y = 200  # Another global variable
>>> eval("x + y", {"x": x})
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
2

Phần kết luận

Bạn có thể sử dụng 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 để đánh giá các biểu thức Python từ đầu vào dựa trên chuỗi hoặc dựa trên mã. Hàm tích hợp này có thể hữu ích khi bạn đang cố gắng đánh giá nhanh các biểu thức Python và bạn muốn tránh rắc rối khi tạo trình đánh giá biểu thức của riêng mình từ đầu.

Trong hướng dẫn này, bạn đã tìm hiểu cách 

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
3 hoạt động và cách sử dụng nó một cách an toàn và hiệu quả để đánh giá các biểu thức Python tùy ý.

Bây giờ bạn có thể:

  • Sử dụng Python 
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    3 để đánh giá động các biểu thức Python cơ bản
  • Chạy các câu lệnh phức tạp hơn như lệnh gọi hàm, tạo đối tượng và truy cập thuộc tính bằng cách sử dụng 
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    3
  • Giảm thiểu rủi ro bảo mật liên quan đến việc sử dụng
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    3

Các khóa học qua video:
Lập trình C Java SQL Server PHP HTML5-CSS3-JavaScript
« Prev: Python: Xây dựng ứng dụng di động với framework Python Kivy Prev: Python: Xây dựng ứng dụng di động với framework Python Kivy
» Next: Python: Dự án Python cho người mới bắt đầu: Thông báo giá Bitcoin Next: Python: Dự án Python cho người mới bắt đầu: Thông báo giá Bitcoin

Copied !!!