noglobal
This python package provides the @noglobal decorator which prohibits the use of global variables from the function scope.
Install
pip install noglobal
Usage
import os.path as osp
from noglobal import NoGlobal
noglobal = NoGlobal(globals()).noglobal
foo = 3
def bar():
return "bar"
@noglobal
def f():
print(osp.join("foo", "bar"))
print(bar())
print(foo)
f()
foo/bar
bar
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Input In [1], in <cell line: 16>()
13 print(bar())
14 print(foo)
---> 16 f()
Input In [1], in f()
12 print(osp.join("foo", "bar"))
13 print(bar())
---> 14 print(foo)
NameError: name 'foo' is not defined
FAQ
How all this works?
The function with @noglobal decorator are re-created as a type.FunctionType object, with no global variables.
All globals are affected?
No. Althogh this package name is "noglobal", the globals below are not affected:
- modules
- callable objects (which means the objects which have
__call__method)
Thus you can not bother importing already imported modules everytime, and so on for the funcsions or classes.
Can we use explicit global variables?
No. Functions with the @noglobal decorator also disallow the explicit use of global variables. That is, if you update a variable bound by a global declaration within a function, the original global variable will not be affected.
The following code prints 10 on the standard output.
bar = 10
@noglobal
def foo():
global bar
bar = 11
foo()
print(bar)
What happens for the nested functions?
Nested functions in the function decorated with @noglobal are also affected.
For example, the code below returns error:
buzz = 11
@noglobal
def foo():
def bar():
print(buzz)
bar()
foo()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In [8], line 1
----> 1 foo()
Cell In [7], line 5, in foo()
3 def bar():
4 print(buzz)
----> 5 bar()
Cell In [7], line 4, in foo.<locals>.bar()
3 def bar():
----> 4 print(buzz)
NameError: name 'buzz' is not defined
Attribution
Based on the source codes:
- originally posted in StackOverflow: (CC BY-SA 3.0)
- later modified by
Release files for noglobal 1.0.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| noglobal-1.0.4.tar.gz | 3.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| noglobal-1.0.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 7.0 kB
Release files / noglobal-1.0.4.tar.gz
| Download URL | noglobal-1.0.4.tar.gz |
|---|---|
| Size | 3.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8e91d0474855edeae8196f97467679e1d3a289e68746ee8f6108c5e06dc607b4
|
|
BLAKE2b-256 checksum How to use checksums |
ddc2cd4041e4b147d569beac27f616972e0a1d6f810344032888f63b47197577
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.1 CPython/3.10.8
|
Release files / noglobal-1.0.4-py3-none-any.whl
| Download URL | noglobal-1.0.4-py3-none-any.whl |
|---|---|
| Size | 3.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2cf40ce43fe2946b6600bb20d905e573bc90bb2249335dc5d23d6ff2b8a03772
|
|
BLAKE2b-256 checksum How to use checksums |
94f8906d063d8467c8f56c06dfeeb443928d91d227a1f4b2b050b561ab398f6e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.1 CPython/3.10.8
|