Sunday, December 8, 2019

Python Eval() Function



Python Eval() Function

The eval() function in python evaluates any python statement. The 1st argument to eval function must be a string , bytes or code object.

Example 1:   Python Code below

>>> variable = ‘5+(6/3)’

>>> eval(variable)

7.0 à Result

If you directly pass a statement to eval() function it won’t execute and throws below error.

>>> eval(5+(6/3))

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: eval() arg 1 must be a string, bytes or code object



If you quote the input statement, then it works.

>>> eval('5+(6/3)')

7.0 à Result

The complete Syntax of eval() function is given below. Where parameter 2nd & 3rd are optional.

eval(expression, globals, locals)

expression: A string, bytes or code object.

globals: A dictionary referring global methods & Variable.

locals: A dictionary referring local methods & Variable.



When we use eval() function without 2nd & 3rd parameter, the application is executed in current scope and the available methods and variable to the program can be checked using below code:

>>> eval(‘dir()’)

Output : ['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']



To see the available methods & variable in globals & locals dictionary run below commands:

>>> eval('globals()')

>>> eval('locals()')



Example 2: I am creating my own function and a variable here. Now globals() & locals() have my function and variable in it as it is running in current context.  Since output is dictionary, it is embraced by curly braces.

>>> def myfunction():

...     print('This is my function')

...

>>> myvar = 123

>>> globals()

{'__name__': '__main__', '__doc__': None, '__package__': None,'__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'myfunction': <function myfunction at 0x7f3659ddab00>, 'myvar': 123}





>>> locals()

{'__name__': '__main__', '__doc__': None, '__package__': None,'__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'myfunction': <function myfunction at 0x7f3659ddab00>, 'myvar': 123}



You can also restrict the method available to statement in eval() first parameters by explicitly mentioning them.



>>> from math import *

>>> eval('dir()') àReturns all from dir and math.

['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']

>>> eval('dir()',{'sin':sin})   à Here in explicitly defining to have Sin method available only.

 ['__builtins__', 'sin']



Example 3: In Below code I am import math library but I in my eval() I am only making Sin function to be available to expression.So it throwing error .



>>> from math import *

>>> a=5

>>> eval('sqrt(a)')

2.23606797749979

>>> eval('sqrt(a)',{'sin':sin})

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "<string>", line 1, in <module>

NameError: name 'sqrt' is not defined


















GC Trigger Conditions



The heart of Dot Net framework is CLR (Common Language Runtime). The CLR has multiple below responsibilities:

1.       Efficiently allocated object on managed heap.

2.       If an object is not in use, clear the memory used by the object.

3.       Keep the memory available for any future objects allocations.

The CLR triggers the garbage collection when one of the condition is met.

1.       The memory used by allocated objects has passed the threshold value set by CLR.

2.       The system has got low memory.

3.       The GC. Collect method is called on Object explicitly.