Python:使用带有* args的已定义参数

时间:2014-11-19 15:47:12

标签: python python-2.7 args

重写以更清楚地说明用例并更好地回答Anentropic的问题。

def use_all (step_todo, wait_complete=True, *args):
    execute_step1 (step-todo)
    handle_args (*args)
    if not wait_complete: 
       do_somehing ()
       return
    execute_stepN ()

@decorate
def use_from (step_todo, *args):
    use_all (step_todo, args)

@decorate
def use_many ():
    use_all (step_todo1, wait_complete=False)
    use_all (step_todo2, args2)
    use_all (step_todo3)

use_all是处理步骤的主要“执行者”(确切地说pxssh用于安装)。 不应该装饰带有开始/停止注释,因为可能会从一个过程中多次调用(例如step_many,这是重启 - 没有{{1的原因}},但单步

由于用例是特定的,我可能会看到解决方案将wait_complete处理为包含元组的_single命名变量,例如:

*args

这是正确的(推荐的)解决方案吗?

这与问题python function *args and **kwargs with other specified keyword argumentsUsing default arguments before positional arguments有某种关联。可能解析def use_all (step_todo, wait_complete=True, args_list=()): 保留 Python R2.7吗?

由于 扬

2 个答案:

答案 0 :(得分:0)

你需要这样做:

def use_from(step_todo, *args):
    use_all(step_todo, *args)

...否则你用一个包含值列表的arg调用use_all,而不是用多个args调用它

另外,不要在你的功能和括号之间加一个空格,这是不好的风格:)

要解决wait_complete取得你的第一个arg值的问题,你需要明确地传递它,例如:

def use_from(step_todo, *args):
    use_all(step_todo, True, *args)

答案 1 :(得分:0)

在Python 2.7中无法做到这一点,但是在python 3.x中你可以:

def use_all (step_todo, *args, wait_complete=True):
    print('W_C: {0}'.format(wait_complete))
    print('Args: {0}'.format(args))

def use_from (step_todo, *args, **kwargs):
    use_all (step_todo, *args, **kwargs)

use_from ('Step1')
use_from ('Step3', 'aa:bb:cc')

输出继电器:

>>> W_C: True
>>> Args: ()
>>> W_C: True
>>> Args: ('aa:bb:cc',)