Hướng dẫn python eval vs exec - python eval so với thực thi

Câu trả lời ngắn, hoặc tl; dr

Về cơ bản,

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 được sử dụng để đánh giá một biểu thức python được tạo động duy nhất và
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 được sử dụng để thực thi mã python được tạo động chỉ cho các tác dụng phụ của nó.evaluate a single dynamically generated Python expression, and
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 is used to execute dynamically generated Python code only for its side effects.

Show

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 và
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 có hai khác biệt sau:

  1. >>> eval(compile('42', '', 'exec'))  # code returns None
    >>> eval(compile('42', '', 'eval'))  # code returns 42
    42
    >>> exec(compile('42', '', 'eval'))  # code returns 42,
    >>>                                          # but ignored by exec
    
    4 chỉ chấp nhận một biểu thức duy nhất,
    >>> eval(compile('42', '', 'exec'))  # code returns None
    >>> eval(compile('42', '', 'eval'))  # code returns 42
    42
    >>> exec(compile('42', '', 'eval'))  # code returns 42,
    >>>                                          # but ignored by exec
    
    5 có thể lấy một khối mã có các câu lệnh Python: Loops,
    >>> compile('for i in range(3): print(i)', '', 'eval')
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        for i in range(3): print(i)
          ^
    SyntaxError: invalid syntax
    
    0,
    >>> compile('for i in range(3): print(i)', '', 'eval')
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        for i in range(3): print(i)
          ^
    SyntaxError: invalid syntax
    
    1 và Chức năng/Phương thức
    >>> compile('for i in range(3): print(i)', '', 'eval')
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        for i in range(3): print(i)
          ^
    SyntaxError: invalid syntax
    
    2initions, v.v.single expression,
    >>> eval(compile('42', '', 'exec'))  # code returns None
    >>> eval(compile('42', '', 'eval'))  # code returns 42
    42
    >>> exec(compile('42', '', 'eval'))  # code returns 42,
    >>>                                          # but ignored by exec
    
    5 can take a code block that has Python statements: loops,
    >>> compile('for i in range(3): print(i)', '', 'eval')
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        for i in range(3): print(i)
          ^
    SyntaxError: invalid syntax
    
    0,
    >>> compile('for i in range(3): print(i)', '', 'eval')
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        for i in range(3): print(i)
          ^
    SyntaxError: invalid syntax
    
    1 and function/method
    >>> compile('for i in range(3): print(i)', '', 'eval')
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        for i in range(3): print(i)
          ^
    SyntaxError: invalid syntax
    
    2initions and so on.

    Một biểu thức trong Python là bất cứ điều gì bạn có thể có là giá trị trong một gán biến:

    a_variable = (anything you can put within these parentheses is an expression)
    
  2. >>> eval(compile('42', '', 'exec'))  # code returns None
    >>> eval(compile('42', '', 'eval'))  # code returns 42
    42
    >>> exec(compile('42', '', 'eval'))  # code returns 42,
    >>>                                          # but ignored by exec
    
    4 Trả về giá trị của biểu thức đã cho, trong khi
    >>> eval(compile('42', '', 'exec'))  # code returns None
    >>> eval(compile('42', '', 'eval'))  # code returns 42
    42
    >>> exec(compile('42', '', 'eval'))  # code returns 42,
    >>>                                          # but ignored by exec
    
    5 bỏ qua giá trị trả về từ mã của nó và luôn trả về
    >>> compile('for i in range(3): print(i)', '', 'eval')
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        for i in range(3): print(i)
          ^
    SyntaxError: invalid syntax
    
    5 (trong Python 2, nó là một tuyên bố và không thể được sử dụng như một biểu thức, vì vậy nó thực sự không trả lại bất cứ điều gì).returns the value of the given expression, whereas
    >>> eval(compile('42', '', 'exec'))  # code returns None
    >>> eval(compile('42', '', 'eval'))  # code returns 42
    42
    >>> exec(compile('42', '', 'eval'))  # code returns 42,
    >>>                                          # but ignored by exec
    
    5 ignores the return value from its code, and always returns
    >>> compile('for i in range(3): print(i)', '', 'eval')
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        for i in range(3): print(i)
          ^
    SyntaxError: invalid syntax
    
    5 (in Python 2 it is a statement and cannot be used as an expression, so it really does not return anything).

Trong các phiên bản 1.0 - 2.7,

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 là một tuyên bố, bởi vì CPython cần tạo ra một loại đối tượng mã khác cho các chức năng sử dụng
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 cho các tác dụng phụ của nó bên trong hàm.

Trong Python 3,

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 là một hàm; Việc sử dụng nó không có tác dụng đối với mã byte được biên dịch của hàm nơi nó được sử dụng.


Do đó về cơ bản:

>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax

Chế độ

>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
9 trong
>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>
0 biên dịch bất kỳ số lượng câu lệnh nào vào mã byte hoàn toàn luôn trả về
>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
5, trong khi ở chế độ
>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>
2, nó biên dịch một biểu thức duy nhất thành mã byte trả về giá trị của biểu thức đó.

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec

Trong chế độ

>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>
2 (và do đó với hàm
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 nếu một chuỗi được truyền vào),
>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
9 sẽ tăng một ngoại lệ nếu mã nguồn chứa các câu lệnh hoặc bất cứ điều gì khác ngoài một biểu thức duy nhất:

>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax

Trên thực tế, câu lệnh "Eval chỉ chấp nhận một biểu thức duy nhất" chỉ áp dụng khi một chuỗi (có chứa mã nguồn Python) được truyền đến

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4. Sau đó, nó được biên dịch nội bộ với mã byte bằng cách sử dụng
>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>
7 Đây là nơi sự khác biệt thực sự đến từ.

Nếu một đối tượng

>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>
8 (có chứa mã python byte) được chuyển sang
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 hoặc
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4, chúng sẽ hoạt động giống hệt nhau, ngoại trừ thực tế là
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 bỏ qua giá trị trả về, vẫn luôn trả về
>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
5. Vì vậy, có thể sử dụng
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 để thực hiện một cái gì đó có câu lệnh, nếu bạn chỉ
>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
9D nó thành mã byte trước khi chuyển nó dưới dạng chuỗi:

>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>

Hoạt động không có vấn đề, mặc dù mã được biên dịch chứa các câu lệnh. Nó vẫn trả về

>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
5, bởi vì đó là giá trị trả về của đối tượng mã được trả về từ
>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
9.

Trong chế độ

>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>
2 (và do đó với hàm
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 nếu một chuỗi được truyền vào),
>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
9 sẽ tăng một ngoại lệ nếu mã nguồn chứa các câu lệnh hoặc bất cứ điều gì khác ngoài một biểu thức duy nhất:

>>> compile('for i in range(3): print(i)', ''. 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax

Trên thực tế, câu lệnh "Eval chỉ chấp nhận một biểu thức duy nhất" chỉ áp dụng khi một chuỗi (có chứa mã nguồn Python) được truyền đến >>> eval(compile('42', '', 'exec')) # code returns None >>> eval(compile('42', '', 'eval')) # code returns 42 42 >>> exec(compile('42', '', 'eval')) # code returns 42, >>> # but ignored by exec 4. Sau đó, nó được biên dịch nội bộ với mã byte bằng cách sử dụng >>> eval(compile('if 1: print("Hello")', '', 'exec')) Hello >>> 7 Đây là nơi sự khác biệt thực sự đến từ.

Nếu một đối tượng >>> eval(compile('if 1: print("Hello")', '', 'exec')) Hello >>> 8 (có chứa mã python byte) được chuyển sang >>> eval(compile('42', '', 'exec')) # code returns None >>> eval(compile('42', '', 'eval')) # code returns 42 42 >>> exec(compile('42', '', 'eval')) # code returns 42, >>> # but ignored by exec 5 hoặc >>> eval(compile('42', '', 'exec')) # code returns None >>> eval(compile('42', '', 'eval')) # code returns 42 42 >>> exec(compile('42', '', 'eval')) # code returns 42, >>> # but ignored by exec 4, chúng sẽ hoạt động giống hệt nhau, ngoại trừ thực tế là >>> eval(compile('42', '', 'exec')) # code returns None >>> eval(compile('42', '', 'eval')) # code returns 42 42 >>> exec(compile('42', '', 'eval')) # code returns 42, >>> # but ignored by exec 5 bỏ qua giá trị trả về, vẫn luôn trả về >>> compile('for i in range(3): print(i)', '', 'eval') Traceback (most recent call last): File "", line 1, in File "", line 1 for i in range(3): print(i) ^ SyntaxError: invalid syntax 5. Vì vậy, có thể sử dụng >>> eval(compile('42', '', 'exec')) # code returns None >>> eval(compile('42', '', 'eval')) # code returns 42 42 >>> exec(compile('42', '', 'eval')) # code returns 42, >>> # but ignored by exec 4 để thực hiện một cái gì đó có câu lệnh, nếu bạn chỉ >>> compile('for i in range(3): print(i)', '', 'eval') Traceback (most recent call last): File "", line 1, in File "", line 1 for i in range(3): print(i) ^ SyntaxError: invalid syntax 9D nó thành mã byte trước khi chuyển nó dưới dạng chuỗi:

Hoạt động không có vấn đề, mặc dù mã được biên dịch chứa các câu lệnh. Nó vẫn trả về

>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
5, bởi vì đó là giá trị trả về của đối tượng mã được trả về từ
>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
9.

>>> program = '''
for i in range(3):
    print("Python is cool")
'''
>>> exec(program)
Python is cool
Python is cool
Python is cool
>>> 

Câu trả lời dài hơn, a.k.a các chi tiết đẫm máu

>>> a = 2
>>> my_calculation = '42 * a'
>>> result = eval(my_calculation)
>>> result
84

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 và
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4

Hàm

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 (là một tuyên bố trong Python 2) được sử dụng để thực hiện một câu lệnh hoặc chương trình được tạo động:

exec(compile(source, '', 'exec'))

Hàm

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 hoạt động tương tự cho một biểu thức duy nhất và trả về giá trị của biểu thức:

eval(compile(source, '', 'eval'))

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 và
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 đều chấp nhận chương trình/biểu thức được chạy dưới dạng đối tượng
>>> program = '''
for i in range(3):
    print("Python is cool")
'''
>>> exec(program)
Python is cool
Python is cool
Python is cool
>>> 
6,
>>> program = '''
for i in range(3):
    print("Python is cool")
'''
>>> exec(program)
Python is cool
Python is cool
Python is cool
>>> 
7 hoặc
>>> program = '''
for i in range(3):
    print("Python is cool")
'''
>>> exec(program)
Python is cool
Python is cool
Python is cool
>>> 
8 chứa mã nguồn hoặc dưới dạng đối tượng
>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>
8 có chứa mã byte Python.

>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
0

Nếu A

>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
1

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 tương tự hành xử tương đương với:

>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
2

.

Trong Python 2, cú pháp chính thức cho tuyên bố

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 thực sự là
>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
07, như trong

>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
3

Tuy nhiên, cú pháp thay thế

>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
08 luôn được chấp nhận (xem bên dưới).

>>> compile('for i in range(3): print(i)', '', 'eval') Traceback (most recent call last): File "", line 1, in File "", line 1 for i in range(3): print(i) ^ SyntaxError: invalid syntax 9

>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
10 tích hợp có thể được sử dụng để tăng tốc các yêu cầu lặp đi lặp lại của cùng một mã với
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 hoặc
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 bằng cách biên dịch nguồn thành một đối tượng
>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>
8 trước đó. Tham số
>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
14 kiểm soát loại đoạn mã mà hàm
>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
9 chấp nhận và loại mã byte mà nó tạo ra. Các lựa chọn là
>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>
2,
>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>
0 và
>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
18:

  • Chế độ

    >>> eval(compile('if 1: print("Hello")', '', 'exec'))
    Hello
    >>>
    
    2 mong đợi một biểu thức duy nhất và sẽ tạo ra mã byte rằng khi chạy sẽ trả về giá trị của biểu thức đó:that expression:

    >>> a = 5
    >>> eval('37 + a')   # it is an expression
    42
    >>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
    >>> exec('a = 47')   # modify a global variable as a side effect
    >>> a
    47
    >>> eval('a = 47')  # you cannot evaluate a statement
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        a = 47
          ^
    SyntaxError: invalid syntax
    
    4
  • >>> eval(compile('if 1: print("Hello")', '', 'exec'))
    Hello
    >>>
    
    0 chấp nhận bất kỳ loại cấu trúc python nào từ các biểu thức đơn lẻ đến toàn bộ mô-đun mã và thực thi chúng như thể chúng là các câu lệnh cấp cao của mô-đun. Đối tượng mã trả về
    >>> compile('for i in range(3): print(i)', '', 'eval')
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        for i in range(3): print(i)
          ^
    SyntaxError: invalid syntax
    
    5:

    >>> a = 5
    >>> eval('37 + a')   # it is an expression
    42
    >>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
    >>> exec('a = 47')   # modify a global variable as a side effect
    >>> a
    47
    >>> eval('a = 47')  # you cannot evaluate a statement
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        a = 47
          ^
    SyntaxError: invalid syntax
    
    5
  • >>> a = 5
    >>> eval('37 + a')   # it is an expression
    42
    >>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
    >>> exec('a = 47')   # modify a global variable as a side effect
    >>> a
    47
    >>> eval('a = 47')  # you cannot evaluate a statement
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        a = 47
          ^
    SyntaxError: invalid syntax
    
    18 là một dạng giới hạn của
    >>> eval(compile('if 1: print("Hello")', '', 'exec'))
    Hello
    >>>
    
    0 chấp nhận mã nguồn chứa một câu lệnh (hoặc nhiều câu lệnh được phân tách bằng
    >>> a = 5
    >>> eval('37 + a')   # it is an expression
    42
    >>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
    >>> exec('a = 47')   # modify a global variable as a side effect
    >>> a
    47
    >>> eval('a = 47')  # you cannot evaluate a statement
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        a = 47
          ^
    SyntaxError: invalid syntax
    
    24) nếu câu lệnh cuối cùng là một câu lệnh biểu thức, kết quả bytecode cũng in (!).single statement (or multiple statements separated by
    >>> a = 5
    >>> eval('37 + a')   # it is an expression
    42
    >>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
    >>> exec('a = 47')   # modify a global variable as a side effect
    >>> a
    47
    >>> eval('a = 47')  # you cannot evaluate a statement
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        a = 47
          ^
    SyntaxError: invalid syntax
    
    24) if the last statement is an expression statement, the resulting bytecode also prints the
    >>> a = 5
    >>> eval('37 + a')   # it is an expression
    42
    >>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
    >>> exec('a = 47')   # modify a global variable as a side effect
    >>> a
    47
    >>> eval('a = 47')  # you cannot evaluate a statement
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        a = 47
          ^
    SyntaxError: invalid syntax
    
    25 of the value of that expression to the standard output(!).

    A

    Một đoạn nguồn chứa 2 câu lệnh cấp cao nhất là lỗi đối với

    >>> a = 5
    >>> eval('37 + a')   # it is an expression
    42
    >>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
    >>> exec('a = 47')   # modify a global variable as a side effect
    >>> a
    47
    >>> eval('a = 47')  # you cannot evaluate a statement
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        a = 47
          ^
    SyntaxError: invalid syntax
    
    18, ngoại trừ trong Python 2 có một lỗi đôi khi cho phép nhiều câu lệnh trong mã; Chỉ đầu tiên được biên soạn; phần còn lại bị bỏ qua:

    Trong Python 2.7.8:

    >>> a = 5
    >>> eval('37 + a')   # it is an expression
    42
    >>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
    >>> exec('a = 47')   # modify a global variable as a side effect
    >>> a
    47
    >>> eval('a = 47')  # you cannot evaluate a statement
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        a = 47
          ^
    SyntaxError: invalid syntax
    
    6

    Và trong Python 3.4.2:

    >>> a = 5
    >>> eval('37 + a')   # it is an expression
    42
    >>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
    >>> exec('a = 47')   # modify a global variable as a side effect
    >>> a
    47
    >>> eval('a = 47')  # you cannot evaluate a statement
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 1
        a = 47
          ^
    SyntaxError: invalid syntax
    
    7

    Điều này rất hữu ích để tạo vỏ python tương tác. Tuy nhiên, giá trị của biểu thức không được trả về, ngay cả khi bạn

    >>> eval(compile('42', '', 'exec'))  # code returns None
    >>> eval(compile('42', '', 'eval'))  # code returns 42
    42
    >>> exec(compile('42', '', 'eval'))  # code returns 42,
    >>>                                          # but ignored by exec
    
    4 mã kết quả.

Do đó, sự khác biệt lớn nhất của

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 và
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 thực sự đến từ hàm
>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
9 và các chế độ của nó.


Ngoài việc biên dịch mã nguồn cho mã byte,

>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
9 hỗ trợ biên dịch các cây cú pháp trừu tượng (cây phân tích mã Python) vào các đối tượng
>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>
8; và mã nguồn thành các cây cú pháp trừu tượng (
>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
41 được viết bằng Python và chỉ gọi
>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
42); Chúng được sử dụng ví dụ để sửa đổi mã nguồn một cách nhanh chóng và cũng để tạo mã động, vì thường dễ dàng xử lý mã như một cây của các nút thay vì các dòng văn bản trong các trường hợp phức tạp.


Mặc dù

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 chỉ cho phép bạn đánh giá một chuỗi chứa một biểu thức duy nhất, bạn có thể
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 toàn bộ câu lệnh hoặc thậm chí cả một mô -đun đã được
>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
9D thành mã byte; Đó là, với Python 2,
>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
46 là một tuyên bố và không thể được
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4LED trực tiếp:

>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
8

>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
9 Nó với chế độ
>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>
0 vào đối tượng
>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>
8 và bạn có thể
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 nó; Hàm
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 sẽ trả về
>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
5.
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 it
; the
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 function will return
>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
5.

>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
9

Nếu một người xem xét mã nguồn

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 và
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 trong CPython 3, thì điều này rất rõ ràng; Cả hai đều gọi
>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
56 với cùng một đối số, sự khác biệt duy nhất là
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 trả về rõ ràng
>>> compile('for i in range(3): print(i)', '', 'eval')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    for i in range(3): print(i)
      ^
SyntaxError: invalid syntax
5.

Sự khác biệt về cú pháp của >>> eval(compile('42', '', 'exec')) # code returns None >>> eval(compile('42', '', 'eval')) # code returns 42 42 >>> exec(compile('42', '', 'eval')) # code returns 42, >>> # but ignored by exec 5 giữa Python 2 và Python 3

Một trong những khác biệt chính trong Python 2 là

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 là một tuyên bố và
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 là một hàm tích hợp (cả hai đều là các hàm tích hợp trong Python 3). Một thực tế nổi tiếng là cú pháp chính thức của
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 trong Python 2 là
>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
63.2 is that
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 is a statement and
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
4 is a built-in function (both are built-in functions in Python 3). It is a well-known fact that the official syntax of
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 in Python 2 is
>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
63.

Không giống như phần lớn các hướng dẫn chuyển Python 2 đến 3 dường như được đề xuất, câu lệnh

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 trong Cpython 2 cũng có thể được sử dụng với cú pháp trông giống hệt như lời mời chức năng ____25 trong Python 3. Lý do là Python 0.9.
>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
08 Chức năng tích hợp! Và chức năng tích hợp đó đã được thay thế bằng câu lệnh
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 ở đâu đó trước khi phát hành Python 1.0.exactly like the
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 function invocation in Python 3. The reason is that Python 0.9.9 had the
>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
08 built-in function! And that built-in function was replaced with
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 statement somewhere before Python 1.0 release.

Vì mong muốn không phá vỡ khả năng tương thích ngược với Python 0.9.9, Guido Van Rossum đã thêm một bản hack tương thích vào năm 1993: nếu

>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>
8 là một Tuple có độ dài 2 hoặc 3 và
eval(compile(source, '', 'eval'))
1 và
eval(compile(source, '', 'eval'))
2 không được chuyển vào câu lệnh
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5
>>> eval(compile('if 1: print("Hello")', '', 'exec'))
Hello
>>>
8 sẽ được giải thích như thể phần tử thứ 2 và thứ 3 của tuple lần lượt là
eval(compile(source, '', 'eval'))
1 và
eval(compile(source, '', 'eval'))
2. Hack khả năng tương thích không được đề cập ngay cả trong tài liệu Python 1.4 (phiên bản sớm nhất có sẵn trực tuyến); Và do đó, không được nhiều nhà văn của các hướng dẫn và công cụ chuyển đổi, cho đến khi nó được ghi lại vào tháng 11 năm 2012:

Biểu thức đầu tiên cũng có thể là một tuple có độ dài 2 hoặc 3. Trong trường hợp này, các phần tùy chọn phải được bỏ qua. Mẫu

>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
75 tương đương với
>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
76, trong khi mẫu
>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
77 tương đương với
>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1
    a = 47
      ^
SyntaxError: invalid syntax
78. Hình thức tuple của
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 cung cấp khả năng tương thích với Python 3, trong đó
>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 là một hàm chứ không phải là một câu lệnh.

Đúng, trong CPython 2.7 rằng nó được gọi một cách nghiêm túc là một tùy chọn tương thích về phía trước (tại sao mọi người nhầm lẫn về việc có một tùy chọn tương thích ngược), khi nó thực sự đã ở đó để tương thích ngược trong hai thập kỷ.

Do đó, trong khi

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 là một tuyên bố trong Python 1 và Python 2, và một chức năng tích hợp trong Python 3 và Python 0.9.9,

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
0

đã có hành vi giống hệt nhau trong mọi phiên bản Python được phát hành rộng rãi từ trước đến nay; và hoạt động trong Jython 2.5.2, Pypy 2.3.1 (Python 2.7.6) và IronPython 2.6.1 cũng vậy (Kudos đối với họ theo hành vi không có giấy tờ của Cpython một cách chặt chẽ).

Những gì bạn không thể làm trong Pythons 1.0 - 2.7 với hack khả năng tương thích của nó, là lưu trữ giá trị trả về

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
5 vào một biến:

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
1

.

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
2

Mà một mô hình mà ai đó thực sự có thể đã sử dụng, mặc dù không thể;

Hoặc sử dụng nó trong một danh sách hiểu:

>>> eval(compile('42', '', 'exec'))  # code returns None
>>> eval(compile('42', '', 'eval'))  # code returns 42
42
>>> exec(compile('42', '', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec
3

đó là lạm dụng toàn bộ danh sách (sử dụng vòng lặp

exec(compile(source, '', 'exec'))
4 thay thế!).