Eval () yöntemi, bu yönteme iletilen ifadeyi ayrıştırır ve program içinde python ifadesini (kod) çalıştırır.
Basit bir ifadeyle, eval()
işlev program içinde (argüman olarak iletilen) python kodunu çalıştırır.
Sözdizimi eval()
şöyledir:
eval (ifade, globals = Yok, yereller = Yok)
eval () Parametreler
eval()
Fonksiyon üç parametre alır:
- ifade - bir Python ifadesi olarak ayrıştırılan ve değerlendirilen dize
- globals (isteğe bağlı) - bir sözlük
- yereller (isteğe bağlı) - bir eşleme nesnesi. Sözlük, Python'da standart ve yaygın olarak kullanılan eşleme türüdür.
Küresellerin ve yerellerin kullanımı bu makalenin ilerleyen kısımlarında tartışılacaktır.
Eval () 'dan Dönüş Değeri
Eval () yöntemi, ifadeden değerlendirilen sonucu döndürür.
Örnek 1: eval () Python'da nasıl çalışır?
x = 1 print(eval('x + 1'))
Çıktı
2
Burada eval()
işlev, ifadeyi değerlendirir x + 1
ve print
bu değeri görüntülemek için kullanılır.
Örnek 2: eval () 'un Kullanımını Göstermek İçin Pratik Örnek
# Perimeter of Square def calculatePerimeter(l): return 4*l # Area of Square def calculateArea(l): return l*l expression = input("Type a function: ") for l in range(1, 5): if (expression == 'calculatePerimeter(l)'): print("If length is ", l, ", Perimeter = ", eval(expression)) elif (expression == 'calculateArea(l)'): print("If length is ", l, ", Area = ", eval(expression)) else: print('Wrong Function') break
Çıktı
Bir fonksiyon yazın: calculateArea (l) Uzunluk 1 ise Alan = 1 Uzunluk 2 ise Alan = 4 Uzunluk 3 ise Alan = 9 Uzunluk 4 ise Alan = 16
Eval () kullanılırken uyarılar
Bir Unix sistemi (macOS, Linux vb.) Kullandığınız ve os
modülü içe aktardığınız bir durumu düşünün . OS modülü, bir dosyaya okuma veya yazma gibi işletim sistemi işlevlerini kullanmanın taşınabilir bir yolunu sağlar.
Kullandığınız girişine kullanıcılara değer izin verirseniz eval(input())
, kullanıcı değişikliği dosyasına konu komutları ve hatta komutunu kullanarak tüm dosyaları silebilirsiniz: os.system('rm -rf *')
.
eval(input())
Kodunuzda kullanıyorsanız , kullanıcının hangi değişkenleri ve yöntemleri kullanabileceğini kontrol etmek iyi bir fikirdir. Dir () yöntemini kullanarak hangi değişkenlerin ve yöntemlerin kullanılabilir olduğunu görebilirsiniz.
from math import * print(eval('dir()'))
Çıktı
('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' ceil ',' tarak ',' copysign ',' cos ',' cosh ',' degree ',' dist ',' e ',' erf ' , 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', ' inf ',' isclose ',' isfinite ',' isinf ',' isnan ',' isqrt ',' ldexp ',' lgamma ',' log ',' log10 ',' log1p ','log2 ',' modf ',' nan ',' os ',' perm ',' pi ',' pow ',' prod ',' radyan ',' kalan ',' sin ',' sinh ',' sqrt ' , "tan", "tanh", "tau", "trunc")
Eval () 'de Kullanılabilir Yöntemlerin ve Değişkenlerin Kullanımını Kısıtlama
Çoğu zaman, ifadede (ilk parametreye eval()
) kullanılan tüm mevcut yöntemler ve değişkenler gerekli olmayabilir veya hatta bir güvenlik açıklığına sahip olabilir. İçin bu yöntemlerin ve değişkenlerin kullanımını kısıtlamanız gerekebilir eval()
. Bunu, isteğe bağlı globaller ve yerel parametreler (sözlükler) eval()
işleve geçirerek yapabilirsiniz .
1. Hem global hem de yerel parametreler atlandığında
Her iki parametre de atlanırsa (önceki örneklerimizde olduğu gibi), ifade mevcut kapsamda yürütülür. Aşağıdaki kodu kullanarak mevcut değişkenleri ve yöntemleri kontrol edebilirsiniz:
print(eval('dir()')
2. Küresel parametrenin aktarılması; yereller parametresi atlandı
Genel ve yerel parametreler (sözlükler) sırasıyla genel ve yerel değişkenler için kullanılır. Yereller sözlüğü atlanırsa, varsayılan olarak küresel sözlüğü kullanılır. Yani, globaller hem global hem de yerel değişkenler için kullanılacaktır.
Not: Sırasıyla globals () ve locals () yerleşik yöntemleri kullanarak Python'daki mevcut global ve yerel sözlüğü kontrol edebilirsiniz.
Örnek 3: Boş sözlüğü globals parametresi olarak iletme
from math import * print(eval('dir()', ())) # The code will raise an exception print(eval('sqrt(25)', ()))
Çıktı
('__builtins__') Geri izleme (en son çağrı): Dosya "", satır 5, baskıda (eval ('sqrt (25)', ())) Dosya "", satır 1, NameError'da: ad 'sqrt' Tanımlanmadı
Boş bir sözlüğü global olarak iletirseniz, yalnızca __builtins__
kullanılabilir olanlar expression
(ilk parametre için eval()
).
math
Yukarıdaki programda modülü içe aktarmış olsak da , ifade matematik modülü tarafından sağlanan hiçbir işleve erişemez.
Örnek 4: Bazı Yöntemleri Kullanılabilir Hale Getirme
from math import * print(eval('dir()', ('sqrt': sqrt, 'pow': pow)))
Çıktı
('__builtins__', 'pow', 'sqrt')
Burada ifade yalnızca sqrt()
ve pow()
yöntemlerini birlikte kullanabilir __builtins__
.
İfade için mevcut olan yöntemin adını isteğinize göre değiştirmek de mümkündür:
from math import * names = ('square_root': sqrt, 'power': pow) print(eval('dir()', names)) # Using square_root in Expression print(eval('square_root(9)', names))
Çıktı
('__builtins__', 'güç', 'square_root') 3.0
Yukarıdaki programda square_root()
karekökü kullanarak hesaplar sqrt()
. Ancak, sqrt()
doğrudan kullanmaya çalışmak bir hataya neden olacaktır.
Örnek 5: Yerleşik kullanımın kısıtlanması
__builtins__
İfadede kullanımını aşağıdaki gibi kısıtlayabilirsiniz :
eval(expression, ('__builtins__': None))
3. Hem global hem de yerel sözlüğü iletme
Yereller sözlüğünü ileterek gerekli işlevleri ve değişkenleri kullanıma hazır hale getirebilirsiniz. Örneğin:
from math import * a = 169 print(eval('sqrt(a)', ('__builtins__': None), ('a': a, 'sqrt': sqrt)))
Çıktı
13.0
Bu programda ifade sqrt()
sadece yöntem ve a değişkenine sahip olabilir . Diğer tüm yöntemler ve değişkenler kullanılamaz.
Kullanımını eval()
globaller ve yerel sözlükler geçirerek kısıtlamak, özellikle kullanıcı tarafından eval()
yönteme sağlanan girdileri kullanırken kodunuzu güvenli hale getirecektir .
Not: Bazen eval()
sınırlı adlarla bile güvenli değildir. Bir nesne ve yöntemleri erişilebilir hale getirildiğinde neredeyse her şey yapılabilir. Tek güvenli yol, kullanıcı girişini doğrulamaktır.