Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Self executing functions in python

I have used occasionally (lambda x:<code>)(<some input>) in python, to preserve my namespace's (within the global namespace or elsewhere) cleanliness. One issue with the lambda solution is that it is a very limiting construct in terms of what it may contain.

Note: This is a habit from javascript programming

Is this a recommended way of preserving namespace? If so, is there a better way to implement a self-executing function?

like image 512
Snakes and Coffee Avatar asked Aug 21 '12 06:08

Snakes and Coffee


People also ask

What are self executing functions?

A JavaScript function that runs as soon as it is defined. Also known as an IIFE (Immediately Invoked Function Expression).

What is a self calling function in Python?

self represents the instance of the class. By using the “self” we can access the attributes and methods of the class in python. It binds the attributes with the given arguments. The reason you need to use self. is because Python does not use the @ syntax to refer to instance attributes.

What is self executing code?

A self-executing function is a function in JavaScript that doesn't need to be called for its execution it executes itself as soon as it is created in the JavaScript file. This function does not have a name and is also called an anonymous function.

What is self-invoking function with example?

Self-Invoking FunctionsA self-invoking expression is invoked (started) automatically, without being called. Function expressions will execute automatically if the expression is followed by (). You cannot self-invoke a function declaration.


2 Answers

For a function A that will be called only in a specific function B, you can define A in B, by which I think the namespace will not be polluted. e.g.,

Instead of :

def a_fn():
    //do something
def b_fn():
    //do something
def c_fn():
    b_fn()
    a_fn()

You can:

def c_fn():
    def a_fn():
        //do something
    def b_fn():
        //do something
    b_fn()
    a_fn()

Though I'm not sure if its the pythonic way, I usually do like this.

like image 182
John Wang Avatar answered Sep 27 '22 21:09

John Wang


Regarding the second half of the question

is there a better way to implement a self-executing function?

The standard way (<function-expression>)() is not possible in Python, because there is no way to put a multi-line block into a bracket without breaking Python's fundamental syntax. Nonetheless, Python do recognize the need for using function definitions as expressions and provide decorators (PEP318) as an alternative. PEP318 has an extensive discussion on this issue, in case someone would like to read more.

With decorators, it would be like

evalfn = lambda f: f()

@evalfn
def _():
    print('I execute immediately')

Although vastly different syntatically, we shall see that it really is the same: the function definition is anonimous and used as an expression.

Using decorator for self-excuting functions is a bit of overkill, compared to the let-call-del method shown below. However, it may worth a try if there are many self-execution functions, a self-executing function is getting too long, or you simply don't bother naming these self-executing functions.

def f():
    print('I execute immediately')
f()
del f
like image 27
Huazuo Gao Avatar answered Sep 27 '22 22:09

Huazuo Gao