Hướng dẫn is eval a keyword in python? - eval là một từ khóa trong python?

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để làm sâu sắc thêm sự hiểu biết của bạn: Đánh giá các biểu thức một cách linh hoạt với Python Eval () This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Evaluate Expressions Dynamically With Python eval()

Show

Python sườn

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 cho phép bạn đánh giá các biểu thức Python tùy ý từ đầu vào dựa trên mã dựa trên chuỗi hoặc được biên dịch. Hàm này có thể tiện dụng 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 đến dưới dạng chuỗi hoặc đối tượng mã được biên dịch.
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6
allows you to evaluate arbitrary Python expressions from a string-based or compiled-code-based input. This function can be handy when you’re trying to dynamically evaluate Python expressions from any input that comes as a string or a compiled code object.

Mặc dù Python sườn

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 là một công cụ cực kỳ hữu ích, nhưng chức năng này có một số ý nghĩa bảo mật quan trọng mà bạn nên xem xét trước khi sử dụng nó. Trong hướng dẫn này, bạn sẽ tìm hiểu cách
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 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 thức hoạt động của Python
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    6
    works
  • Cách sử dụng
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    6 để đánh giá động đầu vào dựa trên chuỗi hoặc dựa trên mã tùy ýdynamically evaluate arbitrary string-based or compiled-code-based input
  • Làm thế nào
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    6 có thể 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 quansecurity risks

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 để mã hóa 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ứ mà bạn đã học được về
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 cho một vấn đề trong thế giới thực. Nếu bạn muốn lấy mã cho ứng dụng này, thì bạn có thể nhấp vào hộp bên dưới:

Hiểu Python từ >>> eval("pi = 3.1416") File "", line 1 pi = 3.1416 ^ SyntaxError: invalid syntax 6

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 tích hợp để đánh giá động các biểu thức từ đầu vào dựa trên mã dựa trên chuỗi hoặc được biên dịch. Nếu bạn chuyển trong một chuỗi đến
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6, thì hàm phân tích lại, biên dịch nó thành mã byte và đánh giá nó như một biểu thức python. Nhưng nếu bạn gọi
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 với một đối tượng mã được biên dịch, thì hàm chỉ thực hiện bước đánh giá, khá thuận tiện nếu bạn gọi
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 nhiều lần với cùng một đầu vào.
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6
to dynamically evaluate expressions from a string-based or compiled-code-based input. If you pass in a string to
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6, then the function parses it, compiles it to bytecode, and evaluates it as a Python expression. But if you call
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 with a compiled code object, then the function performs just the evaluation step, which is quite convenient if you call
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 several times with the same input.

Chữ ký của Python từ

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 được định nghĩa như sau:

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

Hàm có một đối số đầu tiên, đượ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
0, giữ biểu thức mà bạn cần đánh giá.
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 cũng có hai đối số tùy chọn:

  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
    
    2
  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
    
    3

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 sử dụng chúng để đánh giá các biểu thức python khi đang bay.

Đối số đầu tiê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 0

Đối số đầu tiên cho

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 đượ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
0. Nó có một đối số cần thiết giữ đầu vào dựa trên chuỗi hoặc dựa trên mã cho hàm. Khi bạn gọi
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6, 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
0 được đánh giá là 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:
>>> # 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
0
. It’s a required argument that holds the string-based or compiled-code-based input to the function. When you call
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6, the content of
>>> # 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
0 is evaluated as a Python expression. Check out the following examples that use string-based input:

>>>

>>> 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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 với một chuỗi làm đối số, hàm trả về giá trị xuất phát từ việc đánh giá chuỗi đầu vào. Theo mặc định,
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 có quyền truy cập vào các tên toàn cầu 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
2 trong ví dụ trên.

Để đá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
0 dựa trên chuỗi, Python từ
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 chạy các bước sau:

  1. Phân tí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
    
    0
    >>> # 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
    
    0
  2. Biên dịch nó với mã byte it to bytecode
  3. Đánh giá nó như một biểu hiện python it as a Python expression
  4. Trả về kết quả đánh giá the result of the evaluation

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
0 cho đối số đầu tiên đến
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 nhấn mạnh 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 xác định biểu thức như sau:expression as follows:

biểu hiện

Một phần của cú pháp có thể được đánh giá theo một số giá trị. Nói cách khác, một biểu thức là sự tích lũy của các yếu tố biểu thức như nghĩa đen, tên, truy cập thuộc tính, toán tử hoặc các cuộc gọi chức năng mà tất cả trả về một giá trị. Trái ngược 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 không thể được sử dụng làm biểu thức, chẳng hạn 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
8. Bài tập cũng là câu lệnh, không biểu thức. (Nguồn)

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

bản tường trình

Một tuyên bố là một phần của bộ (một khối mã của mã). Một câu lệnh là một biểu thức hoặc một trong một số cấu trúc với từ khóa, chẳng hạn 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
9,
>>> 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
8 hoặc
>>> eval("x + y", {"x": x, "y": y})
300
1. (Nguồn)

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6, thì bạn sẽ nhận được
>>> eval("x + y", {"x": x, "y": y})
300
3. Hãy xem ví dụ sau trong đó bạn cố gắng thực thi câu lệ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
9 bằng cách sử dụng
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6:

>>>

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

Khi bạn gọi

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 với một chuỗi làm đối số, hàm trả về giá trị xuất phát từ việc đánh giá chuỗi đầu vào. Theo mặc định,
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 có quyền truy cập vào các tên toàn cầu 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
2 trong ví dụ trên.

Để đá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
0 dựa trên chuỗi, Python từ
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 chạy các bước sau:

>>>

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

Khi bạn gọi

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 với một chuỗi làm đối số, hàm trả về giá trị xuất phát từ việc đánh giá chuỗi đầu vào. Theo mặc định,
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 có quyền truy cập vào các tên toàn cầu 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
2 trong ví dụ trên.

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

>>> eval("x + y", {"x": x, "y": y})
300
3 bất cứ khi 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:

>>>

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

Bạn có thể chuyển một biểu thức đến

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 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("sum([2, 2, 2])", {})
6
>>> eval("min([1, 2, 3])", {})
1
>>> eval("pow(10, 2)", {})
100
1) và nhận được
>>> eval("x + y", {"x": x, "y": y})
300
3 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ể chuyển các đối tượng mã được biên dịch cho Python từ

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6. Để biên dịch mã mà bạn sẽ chuyển sang
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
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
5. Đây là một hàm tích hợp có thể biên dịch chuỗi đầu vào vào đối tượng mã hoặc đối tượng AST để bạn có thể đánh giá nó bằng
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6.

Các 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
5 nằm ngoài phạm vi của hướng dẫn này, nhưng ở đây, một cái nhìn 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
    
    8 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.
    holds the source code that you want to compile. This argument accepts normal strings, byte strings, and AST objects.
  2. >>> eval("sum([2, 2, 2])", {})
    6
    >>> eval("min([1, 2, 3])", {})
    1
    >>> eval("pow(10, 2)", {})
    100
    
    9 cung cấp tệp mà mã được đọc. Nếu bạn sẽ sử dụng đầu vào dựa trên chuỗi, thì giá trị cho đối số này sẽ là
    >>> eval("2 ** 8")
    256
    >>> eval("1024 + 1024")
    2048
    >>> eval("sum([8, 16, 32])")
    56
    >>> x = 100
    >>> eval("x * 2")
    200
    
    00.
    gives the file from which the code was read. If you’re going to use a string-based input, then the value for this argument should be
    >>> eval("2 ** 8")
    256
    >>> eval("1024 + 1024")
    2048
    >>> eval("sum([8, 16, 32])")
    56
    >>> x = 100
    >>> eval("x * 2")
    200
    
    00.
  3. >>> eval("2 ** 8")
    256
    >>> eval("1024 + 1024")
    2048
    >>> eval("sum([8, 16, 32])")
    56
    >>> x = 100
    >>> eval("x * 2")
    200
    
    01 Chỉ định loại mã được biên dịch nào bạn muốn nhận. Nếu bạn muốn xử lý mã được biên dịch với
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    6, thì đối số này sẽ được đặt thành
    >>> eval("2 ** 8")
    256
    >>> eval("1024 + 1024")
    2048
    >>> eval("sum([8, 16, 32])")
    56
    >>> x = 100
    >>> eval("x * 2")
    200
    
    03.
    specifies which kind of compiled code you want to get. If you want to process the compiled code with
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    6, then this argument should be set to
    >>> eval("2 ** 8")
    256
    >>> eval("1024 + 1024")
    2048
    >>> eval("sum([8, 16, 32])")
    56
    >>> x = 100
    >>> eval("x * 2")
    200
    
    03.

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

>>> eval("sum([2, 2, 2])", {})
6
>>> eval("min([1, 2, 3])", {})
1
>>> eval("pow(10, 2)", {})
100
5 để cung cấp các đối tượng mã cho
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 thay vì các chuỗi thông thường. Kiểm tra các ví dụ 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

Bạn có thể chuyển một biểu thức đến

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 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("sum([2, 2, 2])", {})
6
>>> eval("min([1, 2, 3])", {})
1
>>> eval("pow(10, 2)", {})
100
1) và nhận được
>>> eval("x + y", {"x": x, "y": y})
300
3 vì trình phân tích cú pháp không hiểu cú pháp của biểu thức.

  1. Bạn cũng có thể chuyển các đối tượng mã được biên dịch cho Python từ
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    6. Để biên dịch mã mà bạn sẽ chuyển sang
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    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
    
    5. Đây là một hàm tích hợp có thể biên dịch chuỗi đầu vào vào đối tượng mã hoặc đối tượng AST để bạn có thể đánh giá nó bằng
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    6.
    the compiled code
  2. Các 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
    
    5 nằm ngoài phạm vi của hướng dẫn này, nhưng ở đây, một cái nhìn nhanh về ba đối số bắt buộc đầu tiên của nó:
    the result of the evaluation

>>> eval("sum([2, 2, 2])", {})
6
>>> eval("min([1, 2, 3])", {})
1
>>> eval("pow(10, 2)", {})
100
8 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.

>>> eval("sum([2, 2, 2])", {})
6
>>> eval("min([1, 2, 3])", {})
1
>>> eval("pow(10, 2)", {})
100
9 cung cấp tệp mà mã được đọc. Nếu bạn sẽ sử dụng đầu vào dựa trên chuỗi, thì giá trị cho đối số này sẽ là
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
00.parsing and compiling steps. Unneeded repetitions can lead to high CPU times and excessive memory consumption if you’re evaluating complex expressions.

>>> eval("2 ** 8") 256 >>> eval("1024 + 1024") 2048 >>> eval("sum([8, 16, 32])") 56 >>> x = 100 >>> eval("x * 2") 200 01 Chỉ định loại mã được biên dịch nào bạn muốn nhận. Nếu bạn muốn xử lý mã được biên dịch với >>> eval("pi = 3.1416") File "", line 1 pi = 3.1416 ^ SyntaxError: invalid syntax 6, thì đối số này sẽ được đặt thành >>> eval("2 ** 8") 256 >>> eval("1024 + 1024") 2048 >>> eval("sum([8, 16, 32])") 56 >>> x = 100 >>> eval("x * 2") 200 03.

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

>>> eval("sum([2, 2, 2])", {})
6
>>> eval("min([1, 2, 3])", {})
1
>>> eval("pow(10, 2)", {})
100
5 để cung cấp các đối tượng mã cho
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 thay vì các chuỗi thông thường. Kiểm tra các ví dụ 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
2
. It’s optional and holds a dictionary that provides a global namespace to
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6. With
>>> # 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
2, you can tell
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 which global names to use while evaluating
>>> # 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
0.

Nếu bạn sử dụng

>>> eval("sum([2, 2, 2])", {})
6
>>> eval("min([1, 2, 3])", {})
1
>>> eval("pow(10, 2)", {})
100
5 để biên dịch các biểu thức mà bạn sẽ chuyển sang
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6, thì
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 sẽ trải qua các bước sau:

Đánh giá mã được biên dịch

>>>

>>> 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

Trả về kết quả đánh giá

Nếu bạn gọi Python sườn

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 bằng cách sử dụng đầu vào dựa trên mã được biên dịch, thì hàm 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ể tiện dụng 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, nó tốt nhất để đưa ra biểu thức và sử dụng lại mã byte kết quả trên các cuộc gọi tiếp theo đến
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6.

>>>

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

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 sẽ chạy nhanh hơn vì bạn đã thắng được lặp lại các bước phân tích cú pháp và biên dịch. Sự lặp lại không cần thiết có thể dẫn đến thời gian CPU cao và mức tiêu thụ bộ nhớ quá mức nếu bạn đánh giá các biểu thức phức tạp.

Đối số thứ hai:

>>> # 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
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

Đối số thứ hai cho

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 đượ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
2. Nó tùy chọn và giữ một từ điển cung cấp một không gian tên toàn cầu cho
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6. 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
2, bạn có thể nói
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 tên toàn cầu sẽ 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
0.

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

Tất cả các tên được chuyể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
2 trong một từ điển sẽ có sẵn cho
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 tại thời điểm thực hiện. Kiểm tra ví dụ sau, cho thấy cách sử dụng từ điển tùy chỉnh để cung cấp không gian tên toàn cầu cho
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6:

Các ví dụ sau đây cho thấy rằng mặc dù bạn cung cấp một từ điển trống 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
2, cuộc gọi đến
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 vẫn sẽ có quyền truy cập vào các tên tích hợp của Python,:

>>>

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

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

>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
57) 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
2. Vì từ điển đó không chứa một khóa gọi là
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
49, Python tự động chèn một cái có tham chiếu đến các tên trong
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
50. Bằng cách này,
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 có quyền truy cập đầy đủ vào tất cả các tên tích hợp của Python khi nó phân tí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
0.

Nếu bạn gọi

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 mà không chuyển 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
2, thì đối số sẽ mặc định cho từ điển được trả về bởi
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
65 trong môi trường mà
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 được gọi:

>>>

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

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

>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
57) 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
2. Vì từ điển đó không chứa một khóa gọi là
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
49, Python tự động chèn một cái có tham chiếu đến các tên trong
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
50. Bằng cách này,
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 có quyền truy cập đầy đủ vào tất cả các tên tích hợp của Python khi nó phân tí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
0.

Nếu bạn gọi >>> eval("pi = 3.1416") File "", line 1 pi = 3.1416 ^ SyntaxError: invalid syntax 6 mà không chuyển 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 2, thì đối số sẽ mặc định cho từ điển được trả về bởi >>> eval("2 ** 8") 256 >>> eval("1024 + 1024") 2048 >>> eval("sum([8, 16, 32])") 56 >>> x = 100 >>> eval("x * 2") 200 65 trong môi trường mà >>> eval("pi = 3.1416") File "", line 1 pi = 3.1416 ^ SyntaxError: invalid syntax 6 được gọi:

Khi bạn gọi

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 mà 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
2, hàm này 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
0 bằng cách sử dụng từ điển được trả về bởi
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
65 là không gian tên toàn cầu 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
2 và
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
27 vì các biến toàn cầu của chúng có trong phạm vi toàn cầu hiện tại của 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
3
. This is another optional argument that holds a dictionary. In this case, the dictionary contains the variables that
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 uses as local names when evaluating
>>> # 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
0.

Đối số thứ ba:

>>> # 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
3

Python sườn

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 có một đối số thứ ba 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
3. Đây là một đối số tùy chọn khác chứa một từ điển. Trong trường hợp này, từ điển chứa các biến mà
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 sử dụng làm tên địa phương 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
0.

>>>

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

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

>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
57) 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
2. Vì từ điển đó không chứa một khóa gọi là
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
49, Python tự động chèn một cái có tham chiếu đến các tên trong
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
50. Bằng cách này,
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 có quyền truy cập đầy đủ vào tất cả các tên tích hợp của Python khi nó phân tí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
0.

Nếu bạn gọi

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 mà không chuyển 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
2, thì đối số sẽ mặc định cho từ điển được trả về bởi
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
65 trong môi trường mà
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 được gọi:

Khi bạn gọi

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 mà 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
2, hàm này 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
0 bằng cách sử dụng từ điển được trả về bởi
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
65 là không gian tên toàn cầu 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
2 và
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
27 vì các biến toàn cầu của chúng có trong phạm vi toàn cầu hiện tại của bạn.

Đối số thứ ba:

>>> # 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
3

>>>

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

Python sườn

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 có một đối số thứ ba 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
3. Đây là một đối số tùy chọn khác chứa một từ điển. Trong trường hợp này, từ điển chứa các biến mà
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 sử dụng làm tên địa phương 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
0.

Tên địa phương là những tên (biến, hàm, lớp, v.v.) mà bạn xác định bên trong một hàm đã cho. Tên địa phương chỉ có thể nhìn thấy từ bên trong chức năng kèm theo. Bạn xác định các loại tên này khi bạn viết một hàm.

>>>

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 đã được viết, bạn có thể thêm tên địa phương vào mã hoặc phạm vi cục bộ của nó. Tuy nhiên, bạn có thể chuyển một 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
3 và
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 sẽ coi những tên đó là tên địa phương:

Từ điển thứ hai trong cuộc gọi đầu tiên đến

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 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
2. Biến này được giải thích bởi
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 là một biến cục bộ. Nói cách khác, nó được xem là một biến được định nghĩa trong phần thân của
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6.

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 2 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 0 và >>> eval("pi = 3.1416") File "", line 1 pi = 3.1416 ^ SyntaxError: invalid syntax 6 sẽ có quyền truy cập vào nó. Ngược lại, nếu bạn cố gắng sử dụng >>> eval("2 ** 8") 256 >>> eval("1024 + 1024") 2048 >>> eval("sum([8, 16, 32])") 56 >>> x = 100 >>> eval("x * 2") 200 27, thì bạn sẽ nhận được >>> eval("2 ** 8") 256 >>> eval("1024 + 1024") 2048 >>> eval("sum([8, 16, 32])") 56 >>> x = 100 >>> eval("x * 2") 200 26 vì >>> eval("2 ** 8") 256 >>> eval("1024 + 1024") 2048 >>> eval("sum([8, 16, 32])") 56 >>> x = 100 >>> eval("x * 2") 200 27 được định nghĩa 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 2 hoặc 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 3.

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
2, bạn có thể chuyển bất kỳ biến có thể nhìn thấy nào (toàn cầu, cục bộ hoặc không thuộc địa) 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
3. Bạn cũng có thể vượt qua các cặp giá trị khóa tùy chỉnh như
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
95 trong ví dụ trên.
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 sẽ coi tất cả chúng là các 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
3, 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
2. Nó không thể sử dụng các đối số từ khóa với
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6:

Nếu bạn cố gắng sử dụng các đối số từ khóa khi gọi >>> eval("pi = 3.1416") File "", line 1 pi = 3.1416 ^ SyntaxError: invalid syntax 6, thì 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 01 giải thích rằng >>> eval("pi = 3.1416") File "", line 1 pi = 3.1416 ^ SyntaxError: invalid syntax 6 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 2 trước khi bạn 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 3.

Nếu bạn không vượt qua một 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
3, thì nó mặc định cho 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
2. Ở đây, một ví dụ trong đó bạn chuyển một từ điển trống sang
>>> # 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
2 và không có gì 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
3:
are Python expressions that return a truth value (
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
25 or
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
26) when the interpreter evaluates them. They’re commonly used in
>>> 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
9 statements to check if some condition is true or false. Since Boolean expressions aren’t compound statements, you can use
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 to evaluate them:

>>>

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

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 với các biểu thức boolean sử dụng bất kỳ toán tử python nào sau đây:

  • Các toán tử so sánh giá trị:
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    30,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    31,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    32,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    33,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    34,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    35
    :
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    30,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    31,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    32,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    33,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    34,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    35
  • Các toán tử logic (Boolean):
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    36,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    37,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    38
    :
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    36,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    37,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    38
  • Các nhà khai thác kiểm tra thành viên:
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    39,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    40
    :
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    39,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    40
  • Người vận hành danh tính:
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    41,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    42
    :
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    41,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    42

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

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 thay vì sử dụng biểu thức boolean trực tiếp? Chà, giả sử bạn cần thực hiện một tuyên bố có điều kiện, nhưng bạn muốn thay đổi điều kiện khi đang bay:

>>>

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

Bên trong

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
44, bạn sử dụng
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 để đánh giá
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
46 được cung cấp và trả lại
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
47 hoặc
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
48 theo kết quả của đá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ố lượng nào khác với điều kiện bạn gắn bó với tên
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
49 và
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
50 mà bạn đã xác định trong
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
44.

Bây giờ hãy tưởng tượng làm thế nào bạn sẽ thực hiện một cái gì đó như thế này mà không cần sử dụng Python từ

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6. Điều đó sẽ mất ít mã và thời gian hơn? Không đời nào!

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

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 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áy tính Python, thì bạn có thể sử dụng
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 để đánh giá đầu vào của người dùng và trả về kết quả của các tính toán.

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 cùng với
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
56 để thực hiện các thao tác toán học:

>>>

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

Khi bạn sử dụng

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 để đánh giá các biểu thức toán học, bạn có thể vượt qua các biểu thức của bất kỳ loại hoặc độ phức tạp nào.
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 sẽ phân tích chúng, đánh giá chúng và, nếu mọi thứ đều ổn, hãy cho bạn kết quả mong đợi.

Biểu thức đa năng

Cho đến nay, bạn đã học được cách sử dụng

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 với các biểu thức Boolean và Math. Tuy nhiên, bạn có thể sử dụng
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 với các biểu thức python phức tạp hơn kết hợp các cuộc gọi chức năng, tạo đối tượng, truy cập thuộc tính, toàn diện, v.v.

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

>>>

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

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 để thực thi một vài 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,
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 cũng có thể khiến bạn gặp rủi ro bảo mật nghiêm trọng, 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("pi = 3.1416") File "", line 1 pi = 3.1416 ^ SyntaxError: invalid syntax 6

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 cũng có ý nghĩa bảo mật quan trọng.
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 đượ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 hiện động mã Python tùy ý.security implications.
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 is considered insecure because it allows you (or your users) to dynamically execute arbitrary Python code.

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 để đá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 đã thắng được 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 sai.

Vì lý do này, thực tiễn lập trình tốt thường đề nghị sử dụng

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6. Nhưng nếu bạn chọn sử dụng chức năng, thì quy tắc của ngón tay cái là không bao giờ sử dụng nó với đầu vào không đáng tin cậy. Phần khó khăn 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.untrusted input. The tricky part of this rule is figuring out which kinds of input you can trust.

Như một ví dụ về cách sử dụng

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 vô 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
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
69. Ứng dụng sẽ nhận được đầu vào của người dùng và chuyển nó sang
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 để đánh giá.

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

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

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ẽ là khủng khiếp, sẽ không?

Khi đầu vào không được tin tưởng, 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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6. 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 hiện của
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6. Bạn sẽ học một vài kỹ thuật để làm như vậy trong các phần sau.

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 2 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 3

Bạn có thể hạn chế môi trường thực hiện của

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 bằng cách chuyển các từ điển tùy chỉnh cho 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
2 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
3. Ví dụ: bạn có thể chuyển từ điển trống cho cả hai đối số để ngăn chặn
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 truy cập tên trong phạm vi hiện tại hoặc không gian tên hiện tại của người gọi:

>>>

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

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

>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
57) 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
2 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
3, thì
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 đã giành được 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
2 trong không gian tên toàn cầu hoặc không gian tên cục bộ của nó khi đánh giá chuỗi
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
84. Do đó,
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 sẽ ném
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
26.

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
2 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
3 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 Python tựa
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6, bởi vì bạn vẫn có thể truy cập tất cả các tên tích hợp của Python.

Hạn chế sử dụng tên tích hợp

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 tự động chèn một tham chiếu đến từ điển
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
50 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
2 trước khi phân tí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
0. Người dùng độc hại có thể khai thác hành vi này bằng cách sử dụng chức năng tích hợp
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
94 để có quyền truy cập vào thư viện tiêu 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 đây cho thấy rằng bạn có thể sử dụng bất kỳ chức năng tích hợp nào và bất kỳ mô-đun tiêu chuẩn nào như

>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
56 hoặc
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
96 ngay cả 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
2 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
3:

>>>

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

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

>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
57) 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
2 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
3, thì
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 đã giành được 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
2 trong không gian tên toàn cầu hoặc không gian tên cục bộ của nó khi đánh giá chuỗi
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
84. Do đó,
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 sẽ ném
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
26.

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
2 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
3 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 Python tựa
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6, bởi vì bạn vẫn có thể truy cập tất cả các tên tích hợp của Python.

Hạn chế sử dụng tên tích hợp

>>>

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

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

>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
57) 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
2 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
3, thì
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 đã giành được 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
2 trong không gian tên toàn cầu hoặc không gian tên cục bộ của nó khi đánh giá chuỗi
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
84. Do đó,
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 sẽ ném
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
26.

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 2 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 3 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 Python tựa >>> eval("pi = 3.1416") File "", line 1 pi = 3.1416 ^ SyntaxError: invalid syntax 6, bởi vì bạn vẫn có thể truy cập tất cả các tên tích hợp của Python.

Hạn chế sử dụng tên tích hợptype literal like

>>> 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("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
57, or
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
24 along with some special attributes:

>>>

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

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

>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
57) 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
2 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
3, thì
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 đã giành được 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
2 trong không gian tên toàn cầu hoặc không gian tên cục bộ của nó khi đánh giá chuỗi
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
84. Do đó,
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 sẽ ném
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
26.

>>>

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

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

>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
57) 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
2 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
3, thì
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 đã giành được 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
2 trong không gian tên toàn cầu hoặc không gian tên cục bộ của nó khi đánh giá chuỗi
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
84. Do đó,
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 sẽ ném
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
26.

>>>

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

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

>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
57) 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
2 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
3, thì
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 đã giành được 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
2 trong không gian tên toàn cầu hoặc không gian tên cục bộ của nó khi đánh giá chuỗi
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
84. Do đó,
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 sẽ ném
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
26.

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
2 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
3 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 Python tựa
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6, bởi vì bạn vẫn có thể truy cập tất cả các tên tích hợp của Python.

Hạn chế sử dụng tên tích hợp

  1. Như bạn đã thấy trước đó, Python từ
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    6 tự động chèn một tham chiếu đến từ điển
    >>> eval("2 ** 8")
    256
    >>> eval("1024 + 1024")
    2048
    >>> eval("sum([8, 16, 32])")
    56
    >>> x = 100
    >>> eval("x * 2")
    200
    
    50 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
    
    2 trước khi phân tí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
    
    0. Người dùng độc hại có thể khai thác hành vi này bằng cách sử dụng chức năng tích hợp
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    94 để có quyền truy cập vào thư viện tiêu 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.
    a dictionary containing the names that you want to use with
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    6.
  2. Các ví dụ sau đây cho thấy rằng bạn có thể sử dụng bất kỳ chức năng tích hợp nào và bất kỳ mô-đun tiêu chuẩn nào như
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    56 hoặc
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    96 ngay cả 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
    
    2 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
    
    3:
    the input string to bytecode using
    >>> eval("sum([2, 2, 2])", {})
    6
    >>> eval("min([1, 2, 3])", {})
    1
    >>> eval("pow(10, 2)", {})
    100
    
    5 in mode
    >>> eval("2 ** 8")
    256
    >>> eval("1024 + 1024")
    2048
    >>> eval("sum([8, 16, 32])")
    56
    >>> x = 100
    >>> eval("x * 2")
    200
    
    03.
  3. 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
    
    2 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
    
    3 bằng cách sử dụng 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 như bạn đã làm với
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    01 và
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    94 trong mã trên.
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    44 on the bytecode object to make sure it contains only allowed names.
  4. Bạn có thể sử dụng
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    94 để 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
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    56 và
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    96. Với kỹ thuật này, bạn có thể truy cập bất kỳ chức năng hoặc lớp nào được xác định trong
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    56,
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    96 hoặc bất kỳ mô -đun nào khác. Bây giờ hãy tưởng tượng những gì người dùng độc hại có thể làm cho hệ thống của bạn bằng cách sử dụng
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    96 hoặc bất kỳ mô -đun mạnh mẽ nào khác trong thư viện tiêu chuẩn.
    a
    >>> eval("2 ** 8")
    256
    >>> eval("1024 + 1024")
    2048
    >>> eval("sum([8, 16, 32])")
    56
    >>> x = 100
    >>> eval("x * 2")
    200
    
    26 if the user tries to enter a name that’s not allowed.

Để 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

>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
49 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
2. Thực hành tốt khuyên bạn nên sử dụng từ điển tùy chỉnh chứa cặp giá trị khóa
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
11. Kiểm tra ví dụ sau:

>>>

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

Trong

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
46, bạn thực hiện tất cả các bước bạn đã thấy trước đây. Hàm này hạn chế các tên mà bạn có thể sử dụng với
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 chỉ những tên đó trong từ điển
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
48. Để thực hiện điều này, hàm sử dụng
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
44, đây là thuộc tính của một đối tượng mã trả về một tuple chứa tên trong đối tượng mã.

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
46 hoạt động trong thực tế:

>>>

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

Nếu bạn gọi

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
46 để đánh giá các hoạt động số học hoặc nếu bạn sử dụng các biểu thức bao gồm tên được phép, thì bạn sẽ nhận được kết quả dự kiến. Nếu không, bạn sẽ nhận được một
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
26. Trong các ví dụ trên, tên duy nhất mà bạn đã cho phép là
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
01. Các tên khác như
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
54 và
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
55 không được phép, do đó, chức năng tăng
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
26 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, thì bạn có thể viết lại

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

>>>

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

Bây giờ chức năng của bạn 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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
44 và tăng
>>> eval("2 ** 8")
256
>>> eval("1024 + 1024")
2048
>>> eval("sum([8, 16, 32])")
56
>>> x = 100
>>> eval("x * 2")
200
26 nếu tìm thấy. Mặt khác, bạn đánh giá
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
60 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
3.

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 và tăng cường áo giáp của bạn chống lại các cuộc tấn công độc hại.

Hạn chế đầu vào chỉ có nghĩa đen

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 là để đánh giá các chuỗi có chứa các chữ 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 chức năng gọi là

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
64 có thể giúp đạt được mục tiêu này. Chức năng không hỗ trợ các nhà khai thác, nhưng nó không hỗ trợ danh sách, bộ dữ liệu, số, chuỗi, v.v.

>>>

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

Lưu ý rằng

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
64 chỉ hoạt động với các loại chữ tiêu chuẩn. Nó không hỗ trợ việc sử dụng các nhà khai thác hoặc tên. Nếu bạn cố gắng cung cấp một biểu thức cho
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
64, thì bạn sẽ nhận được
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
67. Chức năng này cũng có thể giú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 Python từ
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6.

Sử dụng Python từ >>> eval("pi = 3.1416") File "", line 1 pi = 3.1416 ^ SyntaxError: invalid syntax 6 với >>> eval("pi = 3.1416") File "", line 1 pi = 3.1416 ^ SyntaxError: invalid syntax 70

Trong Python 3.x,

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
70 tích hợp đọc đầu vào của người dùng ở dòng lệnh, chuyển đổi nó thành một chuỗi, dải dòng mới và trả lại kết quả cho người gọi. Vì kết quả của
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
70 là một chuỗi, bạn có thể cung cấp nó thành
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 và đánh giá nó như một biểu thức Python:
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
70
reads the user input at the command line, converts it to a string, strips the trailing newline, and returns the result to the caller. Since the result of
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
70 is a string, you can feed it to
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 and evaluate it as a Python expression:

>>>

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

Bạn có thể kết thúc Python từ

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 khoảng
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
70 để 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 cho
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 vì nó mô phỏng hành vi của
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
70 trong Python 2.x, trong đó
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
70 đánh giá đầu vào của người dùng là biểu thức python và trả về kết quả.

Hành vi này của

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
70 trong Python 2.x đã được thay đổi trong Python 3.x vì ý nghĩa bảo mật của nó.

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

Cho đến nay, bạn đã học được cách thức hoạt động của Python từ ____36 và cách sử dụng nó trong thực tế. Bạn cũng đã học được rằng

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 có ý nghĩa bảo mật quan trọng và nó thường được coi là thực hành tốt để tránh việc sử dụng
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 trong mã của bạn. Tuy nhiên, có một số tình huống trong đó Python xông
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 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ẽ mã hóa một ứng dụng để đánh giá các biểu thức toán học một cách nhanh chóng. Nếu bạn muốn giải quyết vấn đề này mà không cần sử dụng

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6, thì bạn sẽ cần phải trải qua các bước sau:

  1. Phân tích biểu thức đầu vào. the input expression.
  2. Thay đổi các thành phần biểu thức thành các đối tượng Python (số, toán tử, chức năng, v.v.). the expression’s components into Python objects (numbers, operators, functions, and so on).
  3. Kết hợp mọi thứ thành một biểu hiện. everything into an expression.
  4. Xác nhận rằng biểu thức là hợp lệ trong Python. that the expression is valid in Python.
  5. Đánh giá biểu thức cuối cùng và trả về kết quả. the final expression and return the result.

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 để 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.

Bạn có thể nhận mã nguồn cho ứng dụng mà bạn sẽ xây dựng trong phần này bằng cách nhấp vào hộp bên dưới:

Đầu tiên, kích hoạt trình chỉnh sửa mã yêu thích của bạn. Tạo tập lệnh Python mới có tên

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
86, sau đó thêm mã sau:

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

Trong đoạn mã này, trước tiên bạn nhập mô -đun Python từ ____256. Mô -đun này sẽ cho phép bạn thực hiện các thao tác toán học bằng các hàm và hằng số được xác định trước. Hằng số

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
88 chứa một từ điển chứa các tên không đặc biệt trong
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
56. Bằng cách này, bạn sẽ có thể sử dụng chúng với
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6.

Bạn cũng xác định 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 bạn và bạn sẽ in chúng ra màn hình khi cần thiết.

Bây giờ bạn đã sẵn sàng để mã hóa chức năng cốt lõi của ứng dụng của bạn. Trong trường hợp này, bạn muốn mã hóa một hàm nhận 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 gọi là

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

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

Ở đây, cách thức hoạt động của chức năng:

  1. Trong dòng

    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    92, bạn xác định
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    91. Hàm này lấy 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
    
    0 làm đối số và trả về một bản nổi đại diện cho kết quả của việc đánh giá chuỗi là biểu thức toán học.line
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    92
    , you define
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    91. This function takes the string
    >>> # 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
    
    0 as an argument and returns a float that represents the result of evaluating the string as a math expression.

  2. Trong dòng

    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    95, bạn sử dụng
    >>> eval("sum([2, 2, 2])", {})
    6
    >>> eval("min([1, 2, 3])", {})
    1
    >>> eval("pow(10, 2)", {})
    100
    
    5 để 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
    
    0 thành mã python được biên dịch. Hoạt động biên dịch sẽ tăng
    >>> eval("x + y", {"x": x, "y": y})
    300
    
    3 nếu người dùng nhập biểu thức không hợp lệ.line
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    95
    , you use
    >>> eval("sum([2, 2, 2])", {})
    6
    >>> eval("min([1, 2, 3])", {})
    1
    >>> eval("pow(10, 2)", {})
    100
    
    5 to turn the input string
    >>> # 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
    
    0 into compiled Python code. The compiling operation will raise a
    >>> eval("x + y", {"x": x, "y": y})
    300
    
    3 if the user enters an invalid expression.

  3. Trong dòng

    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    99, bạn bắt đầu vòng lặp
    >>> eval("x + y", {"x": x, "y": y})
    300
    
    1 để 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
    
    0 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 một tên không có trong danh sách các tên được phép, thì bạn sẽ tăng
    >>> eval("2 ** 8")
    256
    >>> eval("1024 + 1024")
    2048
    >>> eval("sum([8, 16, 32])")
    56
    >>> x = 100
    >>> eval("x * 2")
    200
    
    26.line
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    99
    , you start a
    >>> eval("x + y", {"x": x, "y": y})
    300
    
    1 loop to inspect the names contained in
    >>> # 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
    
    0 and confirm that they can be used in the final expression. If the user provides a name that is not in the list of allowed names, then you raise a
    >>> eval("2 ** 8")
    256
    >>> eval("1024 + 1024")
    2048
    >>> eval("sum([8, 16, 32])")
    56
    >>> x = 100
    >>> eval("x * 2")
    200
    
    26.

  4. Trong dòng

    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    
    03, 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 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
    
    2 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
    
    3 như thực hành tốt khuyến nghị.
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    88 giữ các chức năng và hằng số được xác định trong
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    56.line
    >>> # Incomplete expression
    >>> eval("5 + 7 *")
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    
    03
    , you perform the actual evaluation of the math expression. Notice that you pass custom dictionaries to
    >>> # 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
    
    2 and
    >>> # 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
    
    3 as good practice recommends.
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    88 holds the functions and constants defined in
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    56.

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
2 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
3, cùng với việc kiểm tra tên trong dòng
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
10, 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
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6.line
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
10
, allows you to minimize the security risks associated with the use of
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6.

Trình đánh giá biểu thức toán học của bạn sẽ được hoàn thành khi bạn viết mã máy khách của nó trong

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
12. Trong chức năng này, bạn sẽ xác định 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 tin nhắn chào mừng cho người dùng a welcome message to the user
  2. Hiển thị lời nhắc đã sẵn sàng để đọc đầu vào của người dùng a prompt ready to read the user’s input
  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 options to get usage instructions and to terminate the application
  4. Đọc biểu thức toán học của người dùng the user’s math expression
  5. Đánh giá biểu thức toán học của người dùng the user’s math expression
  6. In kết quả đánh giá vào màn hình the result of the evaluation to the screen

Kiểm tra triển khai sau của

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

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

Bên trong

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
12, trước tiên bạn in tin nhắn
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
15. Sau đó, bạn đọc đầu vào của người dùng trong một câu lệnh
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
16 để bắt
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
17 và
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
18. Nếu một trong hai trường hợp ngoại lệ này xảy ra, thì bạn sẽ chấm dứt ứng dụng.

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

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
19, thì ứng dụng hiển thị hướng dẫn
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
20 của bạn. Tương tự như vậy, nếu người dùng nhập
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
21 hoặc
>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
22, thì ứng dụng sẽ chấm dứt.

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
91 để đánh giá biểu thức toán học của người dùng và sau đó bạn in kết quả lên màn hình. Điều quan trọng cần lưu ý là một cuộc gọi đến
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
91 có thể nâng cao các ngoại lệ sau:

  • >>> eval("x + y", {"x": x, "y": y})
    300
    
    3: Điều này xảy ra khi người dùng nhập biểu thức không theo cú pháp Python.
    : This happens when the user enters an expression that doesn’t follow Python syntax.
  • >>> eval("2 ** 8")
    256
    >>> eval("1024 + 1024")
    2048
    >>> eval("sum([8, 16, 32])")
    56
    >>> x = 100
    >>> eval("x * 2")
    200
    
    26: Đ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) được phép.
    : This happens when the user tries to use a name (function, class, or attribute) that isn’t allowed.
  • >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    67: Điều này xảy ra khi người dùng cố gắng sử dụng một giá trị được phép làm đầu vào cho một hàm nhất định trong
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    56.
    : This happens when the user tries to use a value that isn’t allowed as an input to a given function in
    >>> x = 100
    >>> eval("if x: print(x)")
      File "", line 1
        if x: print(x)
        ^
    SyntaxError: invalid syntax
    
    56.

Lưu ý rằng trong

>>> # Incomplete expression
>>> eval("5 + 7 *")
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
12, bạn bắt được tất cả các ngoại lệ này và in tin nhắn cho người dùng cho phù hợp. Điều này sẽ cho phép người dùng xem xét biểu thức, khắc phục sự cố và chạy lại chương trình.

Đó là nó! Bạn đã xây dựng 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 Python,

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6. Để chạy ứng dụng, hãy mở dòng lệnh hệ thống của bạn và nhập lệnh sau:

Lệnh này sẽ khởi chạy giao diện dòng lệnh (CLI) của Trình đánh giá biểu thức Math (CLI). Bạn sẽ thấy một cái gì đó như thế này trên màn hình của bạn:

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

Khi bạn ở đó, bạn có thể nhập và đánh giá bất kỳ biểu thức toán học nào. Ví dụ: nhập các biểu thức sau:

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

Nếu bạn nhập biểu thức toán học hợp lệ, thì ứng dụng sẽ đánh giá nó và in kết quả vào màn hình của bạn. Nếu có bất kỳ vấn đề nào với biểu thức của bạn, thì ứng dụng sẽ cho bạn biết:

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

Trong ví dụ đầu tiên, bạn bỏ lỡ dấu ngoặc đơn, vì vậy bạn nhận được một thông báo cho bạn biết rằng cú pháp không chính xác. Sau đó, bạn gọi

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
01, được phép và bạn nhận được thông báo lỗi giải thích. Cuối cùng, bạn gọi hàm
>>> x = 100
>>> eval("if x: print(x)")
  File "", line 1
    if x: print(x)
    ^
SyntaxError: invalid syntax
56 có giá trị đầu vào không hợp lệ và ứng dụng tạo thông báo xác định vấn đề trong đầu vào của bạn.

Ở đó, bạn có nó là người đánh giá biểu thức toán học của bạn đã sẵn sàng! Hãy thoải mái thêm một số tính năng bổ sung. Một vài ý tưởng để bạn bắt đầu bao gồm mở rộng từ điển của các tên được phép và thêm các thông điệp cảnh báo phức tạp hơn. Cho nó một phát bắn và cho chúng tôi biết trong các ý kiến ​​về nó diễn ra như thế nào.

Sự kết luận

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

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 để đá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ã. Chức năng tích hợp này có thể hữu ích khi bạn đang cố gắng đánh giá các biểu thức python một cách nhanh chóng và bạn muốn tránh những rắc rối trong việc tạo ra người đánh giá biểu thức của riêng bạn từ đầu.
>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6
to evaluate Python expressions from a string-based or code-based input. This built-in function can be useful when you’re trying to evaluate Python expressions on the fly and you want to avoid the hassle of creating your own expressions evaluator from scratch.

Trong hướng dẫn này, bạn đã học cách

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 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 từ
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    6 để đánh giá động các biểu thức Python cơ bảnevaluate basic Python expressions
  • Chạy các câu lệnh phức tạp hơn như các cuộc gọi chức năng, tạo đối tượng và truy cập thuộc tính bằng cách sử dụng
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    6function calls, object creation, and attribute access using
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    6
  • Giảm thiểu các rủi ro bảo mật liên quan đến việc sử dụng Python từ
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    6security risks associated with the use of Python’s
    >>> eval("pi = 3.1416")
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    6

Ngoài ra, bạn đã mã hóa một ứng dụng sử dụng

>>> eval("pi = 3.1416")
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
6 để đánh giá tương tác các biểu thức toán học bằng giao diện dòng lệnh. Bạn có thể tải xuống mã ứng dụng bằng cách nhấp vào liên kết bên dưới:

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để làm sâu sắc thêm sự hiểu biết của bạn: Đánh giá các biểu thức một cách linh hoạt với Python Eval () This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Evaluate Expressions Dynamically With Python eval()

Là eval là một từ khóa?

Eval là từ khóa sẵn có có sẵn trong Python.Nó được sử dụng để phân tích biểu thức và thực thi tập lệnh hoặc biểu thức python.Chúng tôi sẽ đánh giá trường hợp sử dụng từ khóa trong trường hợp chuyển đổi.Dưới đây là mã mẫu của bốn chức năng.. It is used to parse the expression and execute Python script or expression. We will eval the keyword use case in the switcher case. Below is the sample code of four functions.

Là một chức năng là một chức năng?

Hàm Eval đánh giá biểu thức chuỗi và trả về giá trị của nó.Ví dụ: Eval ("1 + 1") Trả về 2. Nếu bạn chuyển đến hàm Eval, một chuỗi chứa tên của hàm, hàm Eval trả về giá trị trả về của hàm.. For example, Eval("1 + 1") returns 2. If you pass to the Eval function a string that contains the name of a function, the Eval function returns the return value of the function.

Eval có phải là một biến không?

= là toán tử gán, và Val và _val là các biến.val and _val are variables.

Làm thế nào để bạn viết một đánh giá trong Python?

Python eval () Chức năng cú pháp:..
Cú pháp: Eval (Biểu thức, Globals = none, locals = none).
Parameters:.
Trả về: Trả về đầu ra của biểu thức ..