Python eval ()

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 + 1ve printbu 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 osmodü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()).

mathYukarı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.

Ilginç makaleler...