Skip to content

Instantly share code, notes, and snippets.

@yoshipon
Forked from ax3l/noglobal.py
Last active November 20, 2022 03:45
Show Gist options
  • Save yoshipon/3adba8cc5d7daac6c3256c9163f48920 to your computer and use it in GitHub Desktop.
Save yoshipon/3adba8cc5d7daac6c3256c9163f48920 to your computer and use it in GitHub Desktop.
Useful Noglobal in Python
# License:
# I hereby state this snippet is below "threshold of originality" where applicable (public domain).
#
# Otherwise, since initially posted on Stackoverflow, use as:
# CC-BY-SA 3.0 skyking, Glenn Maynard, Axel Huebl
# http://stackoverflow.com/a/31047259/2719194
# http://stackoverflow.com/a/4858123/2719194
import types
import inspect
def imports():
for name, val in globals().items():
# module imports
if isinstance(val, types.ModuleType):
yield name, val
# functions / callables
if hasattr(val, '__call__'):
yield name, val
def noglobal(fn):
fn_noglobal = types.FunctionType(fn.__code__, dict(imports()))
arg_info = inspect.getfullargspec(fn)
def wrapper(*wrapper_args, **wrapper_kwargs):
kwargs = dict((k, v) for k, v in zip(arg_info.args[::-1], arg_info.defaults[::-1]))
for k, v in zip(arg_info.args, wrapper_args):
kwargs[k] = v
for k, v in wrapper_kwargs.items():
kwargs[k] = v
return fn_noglobal(**kwargs)
return wrapper
# usage example
import numpy as np
import matplotlib.pyplot as plt
import h5py
a = 1
@noglobal
def f(b, c=1):
h5py.is_hdf5("a.tmp")
# only np. shall be known, not numpy.
np.arange(4)
#numpy.arange(4)
# this var access shall break when called
#print(a)
print(b, c)
f(2)
@bilzard
Copy link

bilzard commented Nov 20, 2022

All right. Thanks :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment