重写以更清楚地说明用例并更好地回答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 arguments或Using default arguments before positional arguments有某种关联。可能不解析def use_all (step_todo, wait_complete=True, args_list=()):
和保留 Python R2.7吗?
由于 扬
答案 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',)