Skip to content

0.6.2: Using argname to reimplement nameof (#44)

Compare
Choose a tag to compare
@pwwang pwwang released this 02 Feb 19:53
· 73 commits to master since this release
e63db96
  • Remove argument 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]'
  • Add argument frame to argname, so that it can be wrapped.
    def argname2(arg, *more_args):
        return argname(arg, *more_args, frame=2)
  • Allow 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', {})
  • Add argument 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'
  • Parse the arguments only if needed
    # before
    def func(a, b):
      return argname(a)
    func(x, 1) # NonVariableArgumentError
    
    # after
    func(x, 1) # 'x'
  • Allow variable positional arguments for 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')
  • Add vars_only (defaults to False) argument to helpers.debug so source of expression becomes available
    a=1
    debug(a+a) # DEBUG: a+a=2