Dark magics about variable names in python
MIT License
Bot releases are hidden (Show)
full
for nameof
, use vars_only
instead. When vars_only=False
, source of the argument returned.
# before:
nameof(a.b, full=True) # 'a.b'
nameof(x[0], full=True) # unable to fetch
# after (requires asttoken):
nameof(a.b, vars_only=False) # 'a.b'
nameof(x[0], vars_only=False) # 'x[0]'
frame
to argname
, so that it can be wrapped.
def argname2(arg, *more_args):
return argname(arg, *more_args, frame=2)
argname
to fetch the source of variable keyword arguments (**kwargs
), which will be an empty dict ({}
) when no keyword arguments passed.
def func(a, **kwargs):
return argname(a, kwargs)
# before:
func(x) # raises error
# after:
func(x) # returns ('x', {})
pos_only
to argname
to only match the positional arguments
# before
def func(a, b=1):
return argname(a)
func(x) # 'x'
func(x, b=2) # error since 2 is not ast.Name
# after
def func(a, b=1):
return argname(a, pos_only=True)
func(x) # 'x'
func(x, b=2) # 'x'
# before
def func(a, b):
return argname(a)
func(x, 1) # NonVariableArgumentError
# after
func(x, 1) # 'x'
argname
so that argname(*args)
is allowed
# before
def func(arg, *args):
return argname(arg, args) # *args not allowed
x = y = 1
func(x, y) # ('x', ('y', 1))
# after
def func(arg, *args):
return argname(arg, *args)
x = y = 1
func(x, y) # ('x', 'y')
vars_only
(defaults to False
) argument to helpers.debug
so source of expression becomes available
a=1
debug(a+a) # DEBUG: a+a=2
Wrapper
, register
and debug
moved to varname.helpers
caller
changed to frame
across all APIsignore
accepting module, filename, function, (function, num_decorators), (module, qualname) and (filename, qualname)inject
(Use helpers.regiester
instead)inject_varname
(Use helpers.regiester
instead)namedtuple
frame
and ignore
to Wrapper
helpers.register
as a decorator for functions