Hướng dẫn python eval vs exec - python eval so với thực thi
Câu trả lời ngắn, hoặc tl; drVề cơ bản, 4 được sử dụng để đánh giá một biểu thức python được tạo động duy nhất và 5 được sử dụng để thực thi mã python được tạo động chỉ cho các tác dụng phụ của nó.evaluate a single dynamically generated Python expression, and 5 is used to execute dynamically generated Python code only for its side effects. Show
4 và 5 có hai khác biệt sau:
Trong các phiên bản 1.0 - 2.7, 5 là một tuyên bố, bởi vì CPython cần tạo ra một loại đối tượng mã khác cho các chức năng sử dụng 5 cho các tác dụng phụ của nó bên trong hàm.Trong Python 3, 5 là một hàm; Việc sử dụng nó không có tác dụng đối với mã byte được biên dịch của hàm nơi nó được sử dụng.Do đó về cơ bản:
Chế độ 9 trong 0 biên dịch bất kỳ số lượng câu lệnh nào vào mã byte hoàn toàn luôn trả về 5, trong khi ở chế độ 2, nó biên dịch một biểu thức duy nhất thành mã byte trả về giá trị của biểu thức đó.
Trong chế độ 2 (và do đó với hàm 4 nếu một chuỗi được truyền vào), 9 sẽ tăng một ngoại lệ nếu mã nguồn chứa các câu lệnh hoặc bất cứ điều gì khác ngoài một biểu thức duy nhất:
Trên thực tế, câu lệnh "Eval chỉ chấp nhận một biểu thức duy nhất" chỉ áp dụng khi một chuỗi (có chứa mã nguồn Python) được truyền đến 4. Sau đó, nó được biên dịch nội bộ với mã byte bằng cách sử dụng 7 Đây là nơi sự khác biệt thực sự đến từ.Nếu một đối tượng 8 (có chứa mã python byte) được chuyển sang 5 hoặc 4, chúng sẽ hoạt động giống hệt nhau, ngoại trừ thực tế là 5 bỏ qua giá trị trả về, vẫn luôn trả về 5. Vì vậy, có thể sử dụng 4 để thực hiện một cái gì đó có câu lệnh, nếu bạn chỉ 9D nó thành mã byte trước khi chuyển nó dưới dạng chuỗi:
Hoạt động không có vấn đề, mặc dù mã được biên dịch chứa các câu lệnh. Nó vẫn trả về 5, bởi vì đó là giá trị trả về của đối tượng mã được trả về từ 9.Trong chế độ 2 (và do đó với hàm 4 nếu một chuỗi được truyền vào), 9 sẽ tăng một ngoại lệ nếu mã nguồn chứa các câu lệnh hoặc bất cứ điều gì khác ngoài một biểu thức duy nhất:
Trên thực tế, câu lệnh "Eval chỉ chấp nhận một biểu thức duy nhất" chỉ áp dụng khi một chuỗi (có chứa mã nguồn Python) được truyền đến >>> eval(compile('42', ' |