Skip to content

Capturing scopes of Python functions and closures

Notifications You must be signed in to change notification settings

orent/scope_capture

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

scope_capture

WARNING: I haven't tested it on older Python versions, "3.8" is only a requirement because I'm lazy! Please, if you can afford testing this on older Python versions, send a pull request, it will be very appreciated.

This library will allow you to capture surrounding scopes of functions and closures and freeze them with the callable object itself.

The problem

In Python, variables from closures are not saved when the closure is reached, but instead they are always retrieved by their name from the surrounding scope. This leads to problems like this one:

a = []
for i in [1, 2]:
    a.append(lambda: i)
for f in a:
    print(f())

The code above will output "2" twice, because it's not the value of the variable that was captured, the only thing that was really captured was the name, and it is only resolved when the closure is called. The last value that is associated with the name - "2" - is thus used.

The solution

My library allows the user to freeze closures with their surrounding scope:

from scope_capture import capture

a = []
for i in [1, 2]:
    a.append(capture(lambda: i))
for f in a:
    print(f())

This code will print "1" and then "2", because the contexts of these lambdas were frozen with them.

This library can work with functions too.

Examples

If you want to see examples, check out the test_scope_capture.py file.

Installation

pip install scope_capture

About

Capturing scopes of Python functions and closures

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%