How to iterate over function arguments

后端 未结 5 725
清歌不尽
清歌不尽 2020-12-29 01:40

I have a Python function accepting several string arguments def foo(a, b, c): and concatenating them in a string. I want to iterate over all function arguments

相关标签:
5条回答
  • 2020-12-29 02:18

    Is this perhaps what you'd like?

    def foo(a, b, c):
        "SilentGhost suggested the join"
        ' '.join(i if i is not None else '' for i in vars().values())
    
    def bar(a,b,c): 
        "A very usefull method!"
        print vars()
        print vars().values()
    

    Notice the use of vars(), which returns a dict.

    0 讨论(0)
  • 2020-12-29 02:20
    def func(*args):
        ' '.join(i if i is not None else '' for i in args)
    

    if you're joining on an empty string, you could just do ''.join(i for i in args if i is not None)

    0 讨论(0)
  • 2020-12-29 02:23

    locals() may be your friend here if you call it first thing in your function.

    Example 1:

    >>> def fun(a, b, c):
    ...     d = locals()
    ...     e = d
    ...     print e
    ...     print locals()
    ... 
    >>> fun(1, 2, 3)
    {'a': 1, 'c': 3, 'b': 2}
    {'a': 1, 'c': 3, 'b': 2, 'e': {...}, 'd': {...}}
    

    Example 2:

    >>> def nones(a, b, c, d):
    ...     arguments = locals()
    ...     print 'The following arguments are not None: ', ', '.join(k for k, v in arguments.items() if v is not None)
    ... 
    >>> nones("Something", None, 'N', False)
    The following arguments are not None:  a, c, d
    

    Answer:

    >>> def foo(a, b, c):
    ...     return ''.join(v for v in locals().values() if v is not None)
    ... 
    >>> foo('Cleese', 'Palin', None)
    'CleesePalin'
    

    Update:

    'Example 1' highlights that we may have some extra work to do if the order of your arguments is important as the dict returned by locals() (or vars()) is unordered. The function above also doesn't deal with numbers very gracefully. So here are a couple of refinements:

    >>> def foo(a, b, c):
    ...     arguments = locals()
    ...     return ''.join(str(arguments[k]) for k in sorted(arguments.keys()) if arguments[k] is not None)
    ... 
    >>> foo(None, 'Antioch', 3)
    'Antioch3'
    
    0 讨论(0)
  • 2020-12-29 02:30

    I would use sed s/None//g, but that's not in python, but you can probably use os.popen() to do that.

    0 讨论(0)
  • 2020-12-29 02:38

    You can use the inspect module and define a function like that:

    import inspect
    def f(a,b,c):
        argspec=inspect.getargvalues(inspect.currentframe())
        return argspec
    f(1,2,3)
    ArgInfo(args=['a', 'b', 'c'], varargs=None, keywords=None, locals={'a': 1, 'c': 3, 'b': 2})
    

    in argspec there are all the info you need to perform any operation with argument passed.

    To concatenate the string is sufficient to use the arg info received:

    def f(a,b,c):
        argspec=inspect.getargvalues(inspect.currentframe())
        return ''.join(argspec.locals[arg] for arg in argspec.args)
    

    For reference: http://docs.python.org/library/inspect.html#inspect.getargvalues

    0 讨论(0)
提交回复
热议问题