Python phân tích chuỗi biểu thức boolean

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python cho phép bạn đánh giá các biểu thức Python tùy ý từ đầu vào hoặc dựa trên chuỗi. Hàm này có thể hữu ích khi bạn đang cố gắng đánh giá động các biểu thức Python từ bất kỳ đầu vào nào có dạng chuỗi hoặc đối tượng mã được biên dịch

Mặc dù

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python 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 cân nhắc trước khi sử dụng nó. Trong hướng dẫn này, bạn sẽ tìm hiểu cách thức hoạt động của
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 cũng như 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
    >>> eval["pi = 3.1416"]
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    7 của Python
  • Cách sử dụng
    >>> eval["pi = 3.1416"]
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    7 để đánh giá động đầu vào dựa trên chuỗi hoặc dựa trên mã được biên dịch tùy ý
  • Cách
    >>> eval["pi = 3.1416"]
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    7 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 quan

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python để viết mã ứng dụng đánh giá các biểu thức toán học một cách tương tác. Với ví dụ này, bạn sẽ áp dụng mọi thứ bạn đã học về
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 vào 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

Tải xuống mã mẫu. Nhấp vào đây để lấy mã bạn sẽ sử dụng để tìm hiểu về eval[] của Python trong hướng dẫn này

Hiểu về
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7, thì hàm sẽ phân tích cú pháp chuỗi đó, biên dịch chuỗi đó thành và đánh giá chuỗi đó dưới dạng 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
7 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á, điều này khá thuận tiện nếu bạn gọi
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 nhiều lần với cùng một đầu vào

Chữ ký của Python's

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

eval[expression[, globals[, locals]]]

Hàm nhận đố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
1, chứa biểu thức mà bạn cần đánh giá.
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 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
    
    3
  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
    
    4

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
7 sử dụng chúng để đánh giá các biểu thức Python một cách nhanh chóng

Ghi chú. Bạn cũng có thể sử dụng

>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
6 để tự động thực thi mã Python. Sự khác biệt chính giữa
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 và
>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
6 là
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 chỉ có thể thực thi hoặc đánh giá các biểu thức, trong khi
>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
6 có thể thực thi bất kỳ đoạn mã Python nào

Loại bỏ các quảng cáo

Đố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
1

Đối số đầu tiên của

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 đượ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
1. Đó là một đối số bắt buộc chứa đầu vào dựa trên chuỗi hoặc dựa trên mã được biên dịch cho hàm. Khi bạn gọi
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7, 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
1 được đánh giá là một biểu thức Python. Kiểm tra các ví dụ sau sử dụng đầu vào dựa trên chuỗi

>>>

>>> 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
7 với một chuỗi làm đối số, hàm sẽ trả về giá trị là kết quả của 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
7 có quyền truy cập vào các tên chung như
>>> x = 100  # A global variable
>>> eval["x + 100", {"x": x}]
200
>>> y = 200  # Another global variable
>>> eval["x + y", {"x": x}]
Traceback [most recent call last]:
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
8 trong ví dụ trên

Để đánh giá một

>>> # 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
1 dựa trên chuỗi,
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python thực hiện các bước sau

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

Tên

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

sự diễn đạt

Một đoạn cú pháp có thể được ước tính cho 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 thành phần biểu thức như chữ, tên, truy cập thuộc tính, toán tử hoặc lệnh gọi hàm, tất cả đều trả về một giá trị. Ngược lại với nhiều ngôn ngữ khác, không phải tất cả các cấu trúc ngôn ngữ đều là biểu thức. Cũng có những câu không thể dùng làm biểu thức, chẳng hạn như

>>> eval["x + y", {"x": x, "y": y}]
300
4. Bài tập cũng là câu lệnh, không phải biểu thức. []

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

tuyên bố

Một câu lệnh là một phần của bộ [một “khối” mã]. Câu lệnh là một biểu thức hoặc một trong nhiều cấu trúc có từ khóa, chẳng hạn như

>>> eval["x + y", {"x": x, "y": y}]
300
5,
>>> eval["x + y", {"x": x, "y": y}]
300
4 hoặc
>>> eval["x + y", {"x": x, "y": y}]
300
7. []

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

>>>

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

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python, thì bạn sẽ nhận được một
>>> eval["x + y", {"x": x, "y": y}]
300
9 như trong truy nguyên ở trên. Đó là bởi vì
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 chỉ chấp nhận biểu thức. Bất kỳ tuyên bố nào khác, chẳng hạn như
>>> eval["x + y", {"x": x, "y": y}]
300
5,
>>> eval["x + y", {"x": x, "y": y}]
300
7,
>>> eval["x + y", {"x": x, "y": y}]
300
4,
>>> 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
8,
>>> 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
9 hoặc
>>> eval["sum[[2, 2, 2]]", {}]
6
>>> eval["min[[1, 2, 3]]", {}]
1
>>> eval["pow[10, 2]", {}]
100
0, sẽ gây ra lỗi

Ghi chú. Vòng lặp

>>> eval["x + y", {"x": x, "y": y}]
300
7 là một câu lệnh ghép, nhưng từ khóa
>>> eval["x + y", {"x": x, "y": y}]
300
7 cũng có thể được sử dụng trong phần đọc hiểu, được coi là biểu thức. Bạn có thể sử dụng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 để đánh giá mức độ hiểu mặc dù họ sử dụng từ khóa
>>> eval["x + y", {"x": x, "y": y}]
300
7

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 hoặc

>>>

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python, thì bạn sẽ nhận được một
>>> eval["x + y", {"x": x, "y": y}]
300
9. Các thao tác gán là câu lệnh chứ không phải biểu thức và câu lệnh không được phép với
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7

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

>>> eval["x + y", {"x": x, "y": y}]
300
9 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 mà 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 không thể chuyển một biểu thức tới

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 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 đủ [_______29_______01] và nhận được ____38_______9 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 đến

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python. Để biên dịch mã mà bạn sẽ chuyển đến
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7, bạn có thể sử dụng. Đây là một hàm tích hợp có thể biên dịch một chuỗi đầu vào thành một hoặc một để bạn có thể đánh giá nó bằng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7

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

>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
05 nằm ngoài phạm vi của hướng dẫn này, nhưng đây là một cái nhìn nhanh về ba đối số bắt buộc đầu tiên của nó

  1. >>> eval["2 ** 8"]
    256
    >>> eval["1024 + 1024"]
    2048
    >>> eval["sum[[8, 16, 32]]"]
    56
    >>> x = 100
    >>> eval["x * 2"]
    200
    
    08 giữ mã nguồn mà bạn muốn biên dịch. Đối số này chấp nhận các đối tượng chuỗi, và AST thông thường
  2. >>> eval["2 ** 8"]
    256
    >>> eval["1024 + 1024"]
    2048
    >>> eval["sum[[8, 16, 32]]"]
    56
    >>> x = 100
    >>> eval["x * 2"]
    200
    
    09 cung cấp tệp mà mã được đọc từ đó. Nếu bạn định sử dụng đầu vào dựa trên chuỗi, thì giá trị cho đối số này phải là
    >>> eval["2 ** 8"]
    256
    >>> eval["1024 + 1024"]
    2048
    >>> eval["sum[[8, 16, 32]]"]
    56
    >>> x = 100
    >>> eval["x * 2"]
    200
    
    10
  3. >>> eval["2 ** 8"]
    256
    >>> eval["1024 + 1024"]
    2048
    >>> eval["sum[[8, 16, 32]]"]
    56
    >>> x = 100
    >>> eval["x * 2"]
    200
    
    11 chỉ định loại mã được biên dịch mà bạn muốn nhận. Nếu bạn muốn xử lý mã đã biên dịch với
    >>> eval["pi = 3.1416"]
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    7, thì đối số này phải được đặt thành
    >>> eval["2 ** 8"]
    256
    >>> eval["1024 + 1024"]
    2048
    >>> eval["sum[[8, 16, 32]]"]
    56
    >>> x = 100
    >>> eval["x * 2"]
    200
    
    13

Ghi chú. Để biết thêm thông tin về

>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
05, hãy xem

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

>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
05 để cung cấp các đối tượng mã cho
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 thay vì các chuỗi bình 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

Nếu bạn sử dụng

>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
05 để biên dịch các biểu thức mà bạn sẽ chuyển đến
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7, thì
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 sẽ thực hiện các bước sau

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

Nếu bạn gọi hàm

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python bằng cách sử dụng đầu vào dựa trên mã được biên dịch, thì hàm sẽ thực hiện bước đánh giá và ngay lập tức trả về kết quả. Điều này có thể hữu ích khi bạn cần đánh giá cùng một biểu thức nhiều lần. Trong trường hợp này, tốt nhất là biên dịch trước biểu thức và sử dụng lại mã byte kết quả trong các lệnh gọi tiếp theo tới
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 sẽ chạy nhanh hơn vì bạn sẽ không phải lặp lại các bước phân tích cú pháp và biên dịch. Các lần 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 đang đánh giá các biểu thức phức tạp

Loại bỏ các quảng cáo

Đố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
3

Đối số thứ hai của

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 đượ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
3. Nó là tùy chọn và chứa một từ điển cung cấp toàn cục cho
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7. 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
3, bạn có thể cho biết
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 tên chung nào sẽ sử dụ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
1

Tên chung là tất cả những tên có sẵn trong. Bạn có thể truy cập chúng từ bất kỳ đâu trong mã của mình

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

>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
3 trong từ điển sẽ có sẵn cho
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 tại thời điểm thực hiện. Xem ví dụ sau, ví dụ này cho biết cách sử dụng từ điển tùy chỉnh để cung cấp không gian tên chung cho
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7

>>>

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

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

>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
3 của
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7, thì
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 sẽ chỉ lấy những tên đó làm tên toàn cục. Bất kỳ tên chung nào được xác định bên ngoài từ điển tùy chỉnh này sẽ không thể truy cập được từ bên trong
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7. Đó là lý do tại sao Python tăng
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
37 khi bạn cố truy cập vào
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
38 trong đoạn mã trên. Từ điển được chuyển đến
>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
3 không bao gồm
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
38

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

>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
3 bằng cách liệt kê chúng trong từ điển của mình, sau đó những tên đó sẽ có sẵn trong quá trình đánh giá. Ví dụ: nếu bạn chèn
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
38 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
3, thì đánh giá của
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
44 trong ví dụ trên sẽ hoạt động như mong đợi

>>>

>>> eval["x + y", {"x": x, "y": y}]
300

Vì bạn thêm

>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
38 vào từ điển
>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
3 tùy chỉnh của mình, nên việc đánh giá
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
44 thành công và bạn nhận được giá trị trả về dự kiến ​​là
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
48

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 sẽ hiểu những tên này là tên chung khi chạy

>>>

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

Mặc dù

>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
50 không được xác định trong phạm vi toàn cầu hiện tại của bạn, nhưng biến có mặt trong ____14_______3 với giá trị là ____29_______48. Trong trường hợp này,
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 có quyền truy cập vào
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
50 như thể đó là một biến toàn cục

Cơ chế đằng sau

>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
3 khá linh hoạt. Bạn có thể chuyển bất kỳ biến hiển thị nào [toàn cục, , hoặc ] tớ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
3. Bạn cũng có thể chuyển các cặp khóa-giá trị 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
57 trong ví dụ trên.
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 sẽ coi tất cả chúng là biến toàn cục

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

>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
3 là nếu bạn cung cấp một từ điển tùy chỉnh cho từ điển đó không chứa giá trị cho khóa
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
60, thì tham chiếu đến từ điển của sẽ được tự động chèn vào dưới
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
60 trước khi
>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
1 được phân tích cú pháp. Điều này đảm bảo rằng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 sẽ có toàn quyền truy cập vào tất cả các tên dựng sẵn của Python khi đánh giá
>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
1

Các ví dụ sau đây cho thấy rằng ngay cả khi bạn cung cấp một từ điển trống 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, lệnh gọi tới
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 vẫn sẽ có quyền truy cập vào các tên tích hợp sẵn của Python

>>>

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

Trong đoạn mã trên, bạn cung cấp một từ điển trống [_______29_______68] 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ì từ điển đó không chứa khóa có tên là
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
60, nên Python sẽ tự động chèn một khóa 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
61. Bằng cách này,
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 có toàn quyền truy cập vào tất cả các tên dựng sẵn của Python khi nó phân tích cú pháp
>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
1

Nếu bạn gọi

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 mà không chuyển từ điển tùy chỉnh tớ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
3, thì đối số sẽ mặc định là từ điển được trả về trong môi trường nơi
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 được gọi

>>>

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

Khi bạn gọi

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 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
3, hàm sẽ đánh giá
>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
1 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
76 làm không gian tên chung của nó. Vì vậy, trong ví dụ trên, bạn có thể tự do truy cập vào
>>> x = 100  # A global variable
>>> eval["x + 100", {"x": x}]
200
>>> y = 200  # Another global variable
>>> eval["x + y", {"x": x}]
Traceback [most recent call last]:
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
8 và
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
38 vì chúng là các biến toàn cục được bao gồm trong dữ liệu hiện tại của bạn.

Loại bỏ các quảng cáo

Lập luận 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
4

Python's

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 lấy đối số thứ ba có tên là
>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
4. Đây là một đối số tùy chọn khác chứa từ điển. Trong trường hợp này, từ điển chứa các biến mà
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 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
1

Tên cục bộ là những tên [biến, hàm, lớp, v.v.] mà bạn định nghĩa bên trong một hàm đã cho. Tên cục bộ chỉ hiển thị 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 viết một hàm

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

>>>

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

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 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
8. Biến này được hiểu bởi
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 như một biến cục bộ. Nói cách khác, nó được xem như một biến được xác định trong phần thân của
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7

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
8 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
1 và
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 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
38, thì 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
37 vì
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
38 không được xác định 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
3 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
4

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
3, bạn có thể chuyển bất kỳ biến hiển thị nào [toàn cục, cục bộ hoặc không cục bộ] 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
4. Bạn cũng có thể chuyển các cặp khóa-giá trị tùy chỉnh như
>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
06 trong ví dụ trên.
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 sẽ coi tất cả chúng là biến cục bộ

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

>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
4, 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
3. Không thể sử dụng đối số từ khóa với
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7

>>>

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

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7, 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
12 giải thích rằng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 không cần đố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
3 trước khi có thể cung cấp từ điển
>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
4

Nếu bạn không chuyển một từ điển tớ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
4, thì nó sẽ mặc định là từ điển được chuyển tớ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
3. Đây là một ví dụ trong đó bạn chuyển 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
3 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
4

>>>

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

Cho rằng bạn không cung cấp từ điển tùy chỉnh cho

>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
4, đối số 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
3. Trong trường hợp này,
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 không có quyền truy cập vào
>>> x = 100  # A global variable
>>> eval["x + 100", {"x": x}]
200
>>> y = 200  # Another global variable
>>> eval["x + y", {"x": x}]
Traceback [most recent call last]:
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
8 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 chứa một từ điển trống

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

>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
3 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
4 là Python sẽ tự động chèn khóa
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
60 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
3 nếu khóa đó chưa tồn tại. Điều này xảy ra cho dù bạn có cung cấp từ điển tùy chỉnh cho
>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
3 hay không. Mặt khác, nếu bạn cung cấp một từ điển tùy chỉnh cho
>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
4, thì từ điển đó sẽ không thay đổi trong quá trình thực hiện
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7

Đánh giá các biểu thức bằng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python để đánh giá bất kỳ loại biểu thức Python nào nhưng không phải câu lệnh Python, chẳng hạn như câu lệnh ghép dựa trên từ khóa hoặc câu lệnh gán

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 có thể hữu ích khi bạn cần đánh giá động các biểu thức và sử dụng các kỹ thuật hoặc công cụ Python khác sẽ tăng đáng kể thời gian và công sức phát triển của bạn. Trong phần này, bạn sẽ tìm hiểu cách bạn có thể sử dụng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python để đánh giá các biểu thức Python đa năng, toán học và logic

Biểu thức Boolean

Biểu thức Boolean là biểu thức Python trả về giá trị thực [

>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
36 hoặc
>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
37] khi trình thông dịch đánh giá chúng. Chúng thường được sử dụng trong các câu lệnh
>>> eval["x + y", {"x": x, "y": y}]
300
5 để kiểm tra xem một số điều kiện là đúng hay sai. Vì biểu thức Boolean không phải là câu lệnh ghép nên bạn có thể sử dụng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 để đánh giá chúng

>>>

>>> 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
7 với các biểu thức Boolean sử dụng bất kỳ toán tử Python nào sau đây

  • >>> 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
    
    43,
    >>> x = 100
    >>> eval["if x: print[x]"]
      File "", line 1
        if x: print[x]
        ^
    SyntaxError: invalid syntax
    
    44,
    >>> x = 100
    >>> eval["if x: print[x]"]
      File "", line 1
        if x: print[x]
        ^
    SyntaxError: invalid syntax
    
    45,
    >>> x = 100
    >>> eval["if x: print[x]"]
      File "", line 1
        if x: print[x]
        ^
    SyntaxError: invalid syntax
    
    46
  • >>> x = 100
    >>> eval["if x: print[x]"]
      File "", line 1
        if x: print[x]
        ^
    SyntaxError: invalid syntax
    
    47,
    >>> x = 100
    >>> eval["if x: print[x]"]
      File "", line 1
        if x: print[x]
        ^
    SyntaxError: invalid syntax
    
    48,
    >>> x = 100
    >>> eval["if x: print[x]"]
      File "", line 1
        if x: print[x]
        ^
    SyntaxError: invalid syntax
    
    49
  • >>> x = 100
    >>> eval["if x: print[x]"]
      File "", line 1
        if x: print[x]
        ^
    SyntaxError: invalid syntax
    
    50,
    >>> x = 100
    >>> eval["if x: print[x]"]
      File "", line 1
        if x: print[x]
        ^
    SyntaxError: invalid syntax
    
    51
  • >>> x = 100
    >>> eval["if x: print[x]"]
      File "", line 1
        if x: print[x]
        ^
    SyntaxError: invalid syntax
    
    52,
    >>> x = 100
    >>> eval["if x: print[x]"]
      File "", line 1
        if x: print[x]
        ^
    SyntaxError: invalid syntax
    
    53

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

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 thay vì sử dụng trực tiếp biểu thức Boolean?

>>>

>>> 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
55, bạn sử dụng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 để đánh giá
>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
57 được cung cấp và trả về
>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
58 hoặc
>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
59 tùy theo kết quả đánh giá. Bạn chỉ sử dụng một vài điều kiện khác nhau trong ví dụ trên, nhưng bạn có thể sử dụng bất kỳ số lượng điều kiện nào khác với điều kiện là bạn gắn với các tên
>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
60 và
>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
61 mà bạn đã xác định trong
>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
55

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python. Điều đó sẽ mất ít mã và thời gian hơn?

Loại bỏ các quảng cáo

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

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python là đánh giá các biểu thức toán học từ đầu vào dựa trên chuỗi. Ví dụ: nếu bạn muốn tạo một máy tính Python, thì bạn có thể sử dụng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 để đánh giá đầu vào của người dùng và trả về kết quả 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
7 cùng với
>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
67 để thực hiện các phép toán

>>>

>>> 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
7 để đánh giá các biểu thức toán học, bạn có thể chuyển các biểu thức thuộc bất kỳ loại hoặc độ phức tạp nào.
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 sẽ phân tích chúng, đánh giá chúng và nếu mọi thứ đều ổn, sẽ cung cấp cho bạn kết quả như mong đợi

Biểu thức mục đích chung

Cho đến giờ, bạn đã học cách sử dụng

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 với các biểu thức toán học và Boolean. Tuy nhiên, bạn có thể sử dụng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 với các biểu thức Python phức tạp hơn kết hợp các lệnh gọi hàm, tạo đối tượng, truy cập thuộc tính, hiểu, v.v.

Ví dụ: bạn có thể gọi hàm tích hợp sẵn hoặc hàm mà bạn đã nhập bằng 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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python để thực thi một số lệnh hệ thống. Như bạn có thể tưởng tượng, bạn có thể làm rất nhiều điều hữu ích với tính năng này. Tuy nhiên,
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 cũng có thể khiến bạn gặp rủi ro bảo mật nghiêm trọng, chẳng hạn như cho phép người dùng ác ý 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
7

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python 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
7 đượ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] tự động thực thi mã Python tùy ý

Đây được coi là phương pháp lập trình tồi 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 định sử dụng

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 để đánh giá đầu vào từ người dùng hoặc bất kỳ nguồn bên ngoài nào khác, thì bạn sẽ không biết chắc 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 vào tay kẻ xấu

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7. Nhưng nếu bạn vẫn chọn sử dụng chức năng này, thì nguyên tắc chung là không bao giờ sử dụng chức năng đó với thông tin đầ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

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 một cách vô trách nhiệm có thể khiến 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
80. Ứng dụng sẽ nhận thông tin đầu vào của người dùng và chuyển nó tới
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 để đá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 hộp Linux và quy trình của ứng dụng có quyền phù hợp, thì người dùng độc hại có thể đưa ra một chuỗi nguy hiểm như sau

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

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

Ghi chú. là một hàm tích hợp lấy tên mô-đun làm chuỗi và trả về tham chiếu đến đối tượng mô-đun.

>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
82 là một hàm hoàn toàn khác với câu lệnh
>>> 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
8. Bạn không thể đánh giá một câu lệnh
>>> 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
8 bằng cách sử dụng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7

Khi thông tin đầu vào không đáng tin cậy, không có cách hoàn toàn hiệu quả nào để 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
7. Tuy nhiên, bạn có thể giảm thiểu rủi ro của mình bằng cách hạn chế môi trường thực thi của
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7. Bạn sẽ học một vài kỹ thuật để làm như vậy trong các phần sau

Loại bỏ các quảng cáo

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

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 bằng cách chuyển các từ điển tùy chỉnh tới 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
3 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
4. Ví dụ: bạn có thể chuyển các từ điển trống cho cả hai đối số để ngăn
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 truy cập tên trong trình 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 các 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
68] 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à
>>> # 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
4, thì
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 sẽ không tìm thấy tên
>>> x = 100  # A global variable
>>> eval["x + 100", {"x": x}]
200
>>> y = 200  # Another global variable
>>> eval["x + y", {"x": x}]
Traceback [most recent call last]:
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'y' is not defined
8 trong không gian tên chung hoặc không gian tên cục bộ khi đánh giá chuỗi
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
00. Kết quả là,
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 sẽ ném một
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
37

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
3 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
4 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
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python, bởi vì bạn vẫn có thể truy cập tất cả các tên dựng sẵn của Python

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

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python tự động chèn tham chiếu đến từ điển của
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
61 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
3 trước khi phân tích cú pháp
>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
1. Người dùng ác ý 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 sẵn
>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
82 để 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 sẵn 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
67 hoặc
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
12 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
3 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
4

>>>

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

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
3 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
4 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 giống như bạn đã làm với
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
17 và
>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
82 trong đoạn mã trên

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

>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
82 để 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
67 và
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
12. 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 định nghĩa trong
>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
67,
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
12 hoặc bất kỳ mô-đun nào khác. Bây giờ hãy tưởng tượng những gì một người dùng độc hại có thể làm với hệ thống của bạn bằng cách sử dụng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
12 hoặc bất kỳ mô-đun mạnh mẽ nào khác trong thư viện tiêu chuẩn

Để giảm thiểu rủi ro này, bạn có thể hạn chế quyền truy cập vào các chức năng tích hợp sẵn 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
60 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
3. Thực tiễn tốt khuyên bạn nên sử dụng từ điển tùy chỉnh có chứa cặp khóa-giá trị
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
27. Kiểm tra ví dụ sau

>>>

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

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
27 đế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, thì
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 sẽ không có quyền truy cập trực tiếp vào các hàm tích hợp sẵn của Python như
>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
82. Tuy nhiên, như bạn sẽ thấy trong phần tiếp theo, cách tiếp cận này vẫn không làm cho
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 hoàn toàn an toàn

Hạn chế tên trong đầu vào

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python bằng cách sử dụng các từ điển tùy chỉnh
>>> # Arithmetic operations
>>> code = compile["5 + 4", "", "eval"]
>>> eval[code]
9
>>> code = compile["[5 + 7] * 2", "", "eval"]
>>> eval[code]
24
>>> import math
>>> # Volume of a sphere
>>> code = compile["4 / 3 * math.pi * math.pow[25, 3]", "", "eval"]
>>> eval[code]
65449.84694978735
3 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
4, chức năng này vẫn sẽ dễ bị tổn thương trước một số thủ thuật ưa thích. Ví dụ: bạn có thể truy cập lớp bằng cách sử dụng một loại chữ như
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
37,
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
38,
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
68 hoặc
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
40 cùng với một số thuộc tính đặc biệt

>>>

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

Khi bạn có quyền truy cập vào

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
36, bạn có thể sử dụng phương thức đặc biệt để truy cập vào tất cả các lớp kế thừa từ
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
36. Đây là cách nó hoạt động

>>>

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

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

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

>>>

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

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
36 để trả về một
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
46 chứa lớp
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
47. Chỉ mục đầu tiên [
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
48] trả về lớp
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
47. Khi bạn có quyền truy cập vào
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
47, bạn gọi nó để tạo một đối tượng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
47. Sau đó, bạn gọi
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
52 trên đối tượng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
47 để tạo danh sách mười số nguyên

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
47 để minh họa lỗ hổng bảo mật trong
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7. Bây giờ hãy tưởng tượng những gì một người dùng độc hại có thể làm nếu hệ thống của bạn hiển thị các lớp như

Ghi chú. Để tìm hiểu sâu hơn về các lỗ hổng của

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7, hãy xem bài viết của Ned Batchelder, Eval thực sự nguy hiểm

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

  1. Tạo một từ điển chứa các tên mà bạn muốn sử dụng với
    >>> eval["pi = 3.1416"]
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    7
  2. Biên dịch chuỗi đầu vào thành mã byte bằng cách sử dụng
    >>> eval["2 ** 8"]
    256
    >>> eval["1024 + 1024"]
    2048
    >>> eval["sum[[8, 16, 32]]"]
    56
    >>> x = 100
    >>> eval["x * 2"]
    200
    
    05 ở chế độ
    >>> eval["2 ** 8"]
    256
    >>> eval["1024 + 1024"]
    2048
    >>> eval["sum[[8, 16, 32]]"]
    56
    >>> x = 100
    >>> eval["x * 2"]
    200
    
    13
  3. Kiểm tra
    >>> eval["pi = 3.1416"]
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    61 trên đối tượng mã byte để đảm bảo rằng nó chỉ chứa các tên được phép
  4. Nâng cao
    >>> eval["2 ** 8"]
    256
    >>> eval["1024 + 1024"]
    2048
    >>> eval["sum[[8, 16, 32]]"]
    56
    >>> x = 100
    >>> eval["x * 2"]
    200
    
    37 nếu người dùng cố gắng nhập tên không được phép

Hãy xem chức năng sau đây trong đó bạn thực hiện tất cả các bước này

>>>

>>> 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
63, bạn thực hiện tất cả các bước mà 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
7 chỉ với những tên đó trong từ điển
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
65. Để làm điều này, hàm sử dụng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
61, là một thuộc tính của đối tượng mã trả về một chứa các tên trong đối tượng mã

Các ví dụ sau đây cho thấy cách thức hoạt động của

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
63 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
63 để đánh giá các phép toán số học hoặc nếu bạn sử dụng các biểu thức bao gồm các tên được phép, thì bạn sẽ nhận được kết quả như mong đợi. 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
37. Trong các ví dụ trên, tên duy nhất bạn cho phép là
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
17. Các tên khác như
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
71 và
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
72 không được phép, vì vậy hàm sẽ tạo ra một số
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
37 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
63 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 các tên trong

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
61 và tăng số
>>> eval["2 ** 8"]
256
>>> eval["1024 + 1024"]
2048
>>> eval["sum[[8, 16, 32]]"]
56
>>> x = 100
>>> eval["x * 2"]
200
37 nếu tìm thấy. Nếu không, bạn đánh giá
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
77 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
4

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
7 và củng cố áo giáp của bạn trước các cuộc tấn công nguy hiểm

Loại bỏ các quảng cáo

Hạn chế đầu vào chỉ bằng chữ

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
7 của Python là đánh giá các chuỗi chứa các ký tự Python tiêu chuẩn và biến chúng thành các đối tượng cụ thể

Thư viện tiêu chuẩn cung cấp một chức năng được gọi là có thể giúp đạt được mục tiêu này. Hàm này không hỗ trợ toán tử, nhưng nó 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
81 chỉ hoạt động với các ký tự loại tiêu chuẩn. Nó không hỗ trợ việc sử dụng các toán tử hoặc tên. Nếu bạn cố gắng cung cấp một biểu thức cho
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
81, thì bạn sẽ nhận được một
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
84. Chức năng này cũng có thể giúp bạn giảm thiểu rủi ro bảo mật liên quan đến việc sử dụng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python

Sử dụng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python với
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
87

Trong Trăn 3. x, phần tích hợp đọc đầu vào của người dùng tại dòng lệnh, chuyển đổi nó thành một chuỗi, loại bỏ dòng mới ở cuối và trả về 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
87 là một chuỗi, bạn có thể cung cấp nó cho
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 và đánh giá nó dưới dạng một biểu thức Python

>>>

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

Bạn có thể quấn

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python xung quanh
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
87 để tự động đánh giá đầu vào của người dùng. Đây là trường hợp sử dụng phổ biến cho
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 vì nó mô phỏng hành vi của , trong đó
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
87 đánh giá đầu vào của người dùng dưới dạng biểu thức Python và trả về kết quả

Hành vi này của

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
87 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 bộ đánh giá biểu thức toán học

Cho đến giờ, bạn đã học cách hoạt động của

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python và cách sử dụng nó trong thực tế. Bạn cũng đã biết rằng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 có ý nghĩa bảo mật quan trọng và việc tránh sử dụng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 trong mã của bạn thường được coi là thông lệ tốt. Tuy nhiên, có một số tình huống trong đó
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python có thể giúp bạn tiết kiệm rất nhiều thời gian và công sức

Trong phần này, bạn sẽ viết mã một ứng dụng để đánh giá 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 sử dụng

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7, thì bạn cần thực hiện các bước sau

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

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 để giải quyết vấn đề này và bạn đã học được một số kỹ thuật để giảm rủi ro bảo mật liên quan

Bạn có thể lấy 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

Tải xuống mã mẫu. Nhấp vào đây để lấy mã bạn sẽ sử dụng để tìm hiểu về eval[] của Python trong hướng dẫn này

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

>>> # Incomplete expression
>>> eval["5 + 7 *"]
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
03, rồi thêm đoạn 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

>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
67 của Python. Mô-đun này sẽ cho phép bạn thực hiện các phép toán bằng cách sử dụng các hàm và hằng số được xác định trước. Hằng số
>>> # Incomplete expression
>>> eval["5 + 7 *"]
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
05 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
67. 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
7

Bạn cũng xác định thêm ba. Bạn sẽ sử dụng chúng làm giao diện người dùng cho tập lệnh của mình và bạn sẽ in chúng ra màn hình khi cần

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

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
1

Đây là cách chức năng hoạt động

  1. Trong dòng

    >>> # Incomplete expression
    >>> eval["5 + 7 *"]
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    
    09, bạn xác định
    >>> # Incomplete expression
    >>> eval["5 + 7 *"]
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    
    08. 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
    
    1 làm đối số và trả về một số float biểu thị kết quả đánh giá chuỗi dưới dạng biểu thức toán học

  2. Ở dòng

    >>> # Incomplete expression
    >>> eval["5 + 7 *"]
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    
    12, bạn sử dụng
    >>> eval["2 ** 8"]
    256
    >>> eval["1024 + 1024"]
    2048
    >>> eval["sum[[8, 16, 32]]"]
    56
    >>> x = 100
    >>> eval["x * 2"]
    200
    
    05 để 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
    
    1 thành mã Python đã biên dịch. Thao tác biên dịch sẽ tăng
    >>> eval["x + y", {"x": x, "y": y}]
    300
    
    9 nếu người dùng nhập biểu thức không hợp lệ

  3. Trong dòng

    >>> # Incomplete expression
    >>> eval["5 + 7 *"]
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    
    16, bạn bắt đầu một vòng lặp
    >>> eval["x + y", {"x": x, "y": y}]
    300
    
    7 để 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
    
    1 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
    
    37

  4. Trong dòng

    >>> # Incomplete expression
    >>> eval["5 + 7 *"]
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    
    20, bạn thực hiện đánh giá thực tế của biểu thức toán học. Lưu ý rằng bạn chuyển các từ điển tùy chỉnh tớ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
    
    3 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
    
    4 theo khuyến nghị của thông lệ tốt.
    >>> # Incomplete expression
    >>> eval["5 + 7 *"]
      File "", line 1
        5 + 7 *
              ^
    SyntaxError: unexpected EOF while parsing
    
    05 giữ các hàm và hằng số được định nghĩa trong
    >>> x = 100
    >>> eval["if x: print[x]"]
      File "", line 1
        if x: print[x]
        ^
    SyntaxError: invalid syntax
    
    67

Ghi chú. Vì ứng dụng này sử dụng các hàm được xác định trong

>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
67, bạn cần cân nhắc rằng một số hàm này sẽ tăng
>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
84 khi bạn gọi chúng với giá trị đầu vào không hợp lệ

Ví dụ:

>>> # Incomplete expression
>>> eval["5 + 7 *"]
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
27 sẽ gây ra lỗi vì căn bậc hai của
>>> # Incomplete expression
>>> eval["5 + 7 *"]
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
28 không được xác định. Sau này, bạn sẽ thấy cách phát hiện lỗi này trong mã máy khách của mình

Việc sử dụng các giá trị tùy chỉnh cho thông 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
3 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
4, 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
31, 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
7

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

>>> # Incomplete expression
>>> eval["5 + 7 *"]
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
33. 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 trình đọc và đánh giá các biểu thức mà người dùng của bạn nhập vào dòng lệnh

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

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

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

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

>>> 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
33, trước tiên bạn in thông báo
>>> # Incomplete expression
>>> eval["5 + 7 *"]
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
36. Sau đó, bạn đọc đầu vào của người dùng trong a để nắm bắt
>>> # Incomplete expression
>>> eval["5 + 7 *"]
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
38 và
>>> # Incomplete expression
>>> eval["5 + 7 *"]
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
39. Nếu một trong hai trường hợp ngoại lệ này xảy ra, thì bạn chấm dứt ứng dụng

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

>>> # Incomplete expression
>>> eval["5 + 7 *"]
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
40, thì ứng dụng sẽ hiển thị hướng dẫn
>>> # Incomplete expression
>>> eval["5 + 7 *"]
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
41 của bạn. Tương tự như vậy, nếu người dùng nhập vào
>>> # Incomplete expression
>>> eval["5 + 7 *"]
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
42 hoặc
>>> # Incomplete expression
>>> eval["5 + 7 *"]
  File "", line 1
    5 + 7 *
          ^
SyntaxError: unexpected EOF while parsing
43, thì ứng dụng sẽ kết thúc

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

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

  • >>> eval["x + y", {"x": x, "y": y}]
    300
    
    9. Điều này xảy ra khi người dùng nhập một biểu thức không tuân theo cú pháp Python
  • >>> eval["2 ** 8"]
    256
    >>> eval["1024 + 1024"]
    2048
    >>> eval["sum[[8, 16, 32]]"]
    56
    >>> x = 100
    >>> eval["x * 2"]
    200
    
    37. Điều này xảy ra khi người dùng cố gắng sử dụng tên [hàm, lớp hoặc thuộc tính] không được phép
  • >>> eval["pi = 3.1416"]
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    84. Điều này xảy ra khi người dùng cố gắng sử dụng một giá trị không được phép làm đầu vào cho một chức năng nhất định trong
    >>> x = 100
    >>> eval["if x: print[x]"]
      File "", line 1
        if x: print[x]
        ^
    SyntaxError: invalid syntax
    
    67

Lưu ý rằng trong

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

Đó 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 70 dòng mã bằng cách sử dụng

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python. Để chạy ứng dụng, hãy mở dòng lệnh của hệ thống và gõ lệnh sau

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

Lệnh này sẽ khởi chạy trình đánh giá biểu thức toán học [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
4

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
5

Nếu bạn nhập một biểu thức toán học hợp lệ, thì ứng dụng sẽ đánh giá nó và in kết quả ra 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
6

Trong ví dụ đầu tiên, bạn bỏ lỡ dấu ngoặc đơn đóng, vì vậy bạn nhận được 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
17, điều này không được phép và bạn nhận được thông báo lỗi có giải thích. Cuối cùng, bạn gọi một hàm
>>> x = 100
>>> eval["if x: print[x]"]
  File "", line 1
    if x: print[x]
    ^
SyntaxError: invalid syntax
67 với giá trị đầu vào không hợp lệ và ứng dụng sẽ tạo một thông báo xác định vấn đề trong đầu vào của bạn

Vậy là xong rồi—công cụ đánh giá biểu thức toán học của bạn đã sẵn sàng. Vui lòng thêm một số tính năng bổ sung. Một số ý tưởng giúp bạn bắt đầu bao gồm mở rộng từ điển các tên được phép và thêm các thông báo cảnh báo phức tạp hơn. Hãy thử và cho chúng tôi biết trong phần nhận xét nó diễn ra như thế nào

Loại bỏ các quảng cáo

Phần kết luận

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

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 của Python để đánh giá các biểu thức Python từ đầu vào dựa trên chuỗi hoặc dựa trên mã. Hàm tích hợp này có thể hữu ích khi bạn đang cố gắng đánh giá các biểu thức Python một cách nhanh chóng và bạn muốn tránh rắc rối khi tạo bộ đánh giá biểu thức của riêng mình từ đầu

Trong hướng dẫn này, bạn đã học cách hoạt động của

>>> eval["pi = 3.1416"]
  File "", line 1
    pi = 3.1416
       ^
SyntaxError: invalid syntax
7 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
    >>> eval["pi = 3.1416"]
      File "", line 1
        pi = 3.1416
           ^
    SyntaxError: invalid syntax
    
    7 của Python để đánh giá động các biểu thức Python cơ bản
  • Chạy các câu lệnh phức tạp hơn như gọi hàm, 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
    
    7
  • Giảm thiểu 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
    
    7 của Python

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
7 để đánh giá một cách 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ã của ứng dụng bằng cách nhấp vào liên kết bên dưới

Tải xuống mã mẫu. Nhấp vào đây để lấy mã bạn sẽ sử dụng để tìm hiểu về eval[] của Python trong hướng dẫn này

Đánh dấu là đã hoàn thành

Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Đánh giá các biểu thức một cách linh hoạt với Python eval[]

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Gửi cho tôi thủ thuật Python »

Giới thiệu về Leodanis Pozo Ramos

Leodanis là một kỹ sư công nghiệp yêu thích Python và phát triển phần mềm. Anh ấy là một nhà phát triển Python tự học với hơn 6 năm kinh nghiệm. Anh ấy là một nhà văn đam mê kỹ thuật với số lượng bài báo được xuất bản ngày càng tăng trên Real Python và các trang web khác

» Tìm hiểu thêm về Leodanis

Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Aldren

Bryan

Geir Arne

Joanna

Gia-cốp

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Chuyên gia Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

Làm cách nào để chuyển đổi chuỗi thực thành Boolean trong Python?

Phương pháp 1. Chuyển đổi Chuỗi thành Boolean trong Python sử dụng bool[] . Nếu không có tham số nào được truyền, thì theo mặc định, nó sẽ trả về Sai.

Là == một biểu thức boolean?

Một biểu thức boolean là một biểu thức đánh giá một giá trị boolean. Toán tử đẳng thức == , so sánh hai giá trị và tạo ra một giá trị boolean liên quan đến việc hai giá trị đó có bằng nhau hay không .

Bạn có thể so sánh Boolean với Python không?

Có hai loại toán tử Boolean chính trong Python. Toán tử so sánh. Toán tử so sánh Python so sánh hai giá trị cùng loại và trả về giá trị Boolean là Đúng hoặc Sai . Toán tử logic. Toán tử logic Python kết hợp kết quả của các biểu thức khác và trả về Đúng hoặc Sai.

Làm cách nào để sử dụng eval trong Python?

Bạn có thể sử dụng hàm eval[] tích hợp sẵn của Python để đánh giá động các biểu thức từ đầu vào dựa trên chuỗi hoặc dựa trên mã được biên dịch. .
biểu thức phân tích cú pháp
Biên dịch nó thành mã byte
Đánh giá nó như một biểu thức Python
Trả về kết quả đánh giá

Chủ Đề