Computer >> Máy Tính >  >> Lập trình >> Python

Python eval ()

Phương thức eval () phân tích cú pháp biểu thức được truyền cho phương thức này và chạy biểu thức trong chương trình. Nói cách khác, nó diễn giải một chuỗi dưới dạng mã bên trong một chương trình python.

Cú pháp

Cú pháp cho eval như bên dưới -

eval(expression, globals=None, locals=None)

Ở đâu

  • Biểu thức - Đây là biểu thức python được truyền vào phương thức.

  • hình cầu - Từ điển các phương thức và biến toàn cục có sẵn.

  • người dân địa phương - Từ điển các phương thức và biến cục bộ có sẵn.

Trong ví dụ dưới đây, chúng tôi cho phép người dùng dừng một biểu thức và chạy một chương trình python để đánh giá biểu thức đó. Vì vậy, nó giúp tạo mã động.

Ví dụ

# expression to be evaluated
user_expr = raw_input("Enter an expression in terms of variable a):")
#nter the value of variable
a = int(raw_input("Enter the value of a:"))
# evaluate the expression
result = eval(user_expr)
# printing evaluated result
print("Result = {}".format(result))

Đầu ra

Chạy đoạn mã trên cho chúng ta kết quả sau -

Enter an expression in terms of variable a):a*(a-3)+a^2
Enter the value of a:7
Result = 33

Sự cố bảo mật với eval ()

Đối với các chương trình liên quan đến ứng dụng web hoặc chương trình máy tính để bàn, việc sử dụng phương thức eval () như vậy sẽ tạo ra lỗ hổng bảo mật vì việc sử dụng chạy chương trình có thể cung cấp các biểu thức là lệnh hệ thống để xóa tệp hoặc lấy dữ liệu nhạy cảm ra khỏi hệ thống. Để ngăn chặn điều này, chúng ta có thể hạn chế hàm eval () đối với một số hàm hoặc biến đã chọn.

Các bước để ngăn chặn những lỗ hổng này như sau -

Bỏ qua cả biến cục bộ và biến toàn cục trong phương thức eval ().

Theo cách này, nó sẽ chỉ được đánh giá trong phạm vi hiện tại và không tìm thấy các biến khác ngoài phạm vi này.

Chỉ bỏ qua các tham số cục bộ

Khi bỏ qua biến cục bộ, tất cả các biến được coi là biến toàn cục. Tiếp theo, chúng tôi chuyển một từ điển trống làm biến toàn cục và điều đó chỉ cho phép các biến tích hợp sẵn có sẵn ngay cả khi chúng tôi đã nhập các thư viện khác vào chương trình.

Ví dụ

from time import *
print(eval('dir()', {}))
<đầu ra>

Chạy đoạn mã trên cho chúng ta kết quả sau -

['__builtins__']

Tiếp theo, chúng tôi cũng có thể chỉ cho phép một số phương thức nhất định từ thư viện đã nhập khả dụng cho chương trình.

from time import *
print(eval('dir()', {'sleeptime': sleep, 'Localtime': localtime}))

Đầu ra

Chạy đoạn mã trên cho chúng ta kết quả sau -

['Localtime', '__builtins__', 'sleeptime']

Chuyển các chức năng có chọn lọc cho cả Toàn cầu và Cục bộ

Chúng tôi cũng có thể hạn chế tính khả dụng của chức năng trong cả phạm vi cục bộ và toàn cầu bằng cách cho phép không có nội dung nào được tích hợp sẵn và chỉ một số ít từ các thư viện được nhập cục bộ. Trong ví dụ dưới đây, chúng tôi chỉ cung cấp phương thức gmtime từ thư viện thời gian.

Ví dụ

from time import *
a = 1445945763
print(eval('gmtime(a)', {'__builtins__': None}, {'a': a, 'gmtime': gmtime}))

Đầu ra

Chạy đoạn mã trên cho chúng ta kết quả sau -

time.struct_time(tm_year=2015, tm_mon=10, tm_mday=27, tm_hour=11, tm_min=36, tm_sec=3, tm_wday=1, tm_yday=300, tm_isdst=0)