Python 具有等号和功能参数的问题
我正在尝试构建一个允许重复此操作的函数(它阻止控制台在windows中打开): 因此,我定义了以下函数:Python 具有等号和功能参数的问题,python,python-3.x,Python,Python 3.x,我正在尝试构建一个允许重复此操作的函数(它阻止控制台在windows中打开): 因此,我定义了以下函数: def noWinConsole(program): if platform.system() == 'Windows': startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW subprocess.ca
def noWinConsole(program):
if platform.system() == 'Windows':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
subprocess.call(program, startupinfo=startupinfo)
else:
subprocess.call(program)
但是当我这样调用它时,nowincole(['myprogram.exe','-p',arg],stdout=someFile)
,我得到一个错误,因为stdout=someFile
:
TypeError: noWinConsole() got an unexpected keyword argument 'stdout'
如何修复此问题?
nowInCole
只是一个包装器,目前它只需要一个参数,program
。因此,当您给它两个参数(program
作为第一个位置参数,然后是用于子流程调用的关键字参数stdout
)时,它会崩溃
幸运的是,有一个标准的习惯用法可以生成一个包装器,它可以将任何一组参数传递给一个内部函数。它使用and符号表示参数打包/解包
def noWinConsole(*args, **kwargs):
# Other stuff here as needed
subprocess.call(*args, **kwargs)
这基本上就是这样。函数定义中的*
运算符获取所有输入位置参数,并将它们打包到名为args
的元组中。然后,当您调用子流程
时,*
操作符将该元组解压,以相同的顺序将这些参数传递给下一个函数
**
操作符的工作方式基本相同,只是它捕获像stdout='foo.txt'
这样的关键字参数,并将它们全部打包到像{'stdout':'foo.txt'}
这样的字典中。当您在对内部函数的调用中再次使用**
时,此词典将被解包并转换回关键字参数。NowInCole
只是一个包装器,目前它只需要一个参数,program
。因此,当您给它两个参数(program
作为第一个位置参数,然后是用于子流程调用的关键字参数stdout
)时,它会崩溃
幸运的是,有一个标准的习惯用法可以生成一个包装器,它可以将任何一组参数传递给一个内部函数。它使用and符号表示参数打包/解包
def noWinConsole(*args, **kwargs):
# Other stuff here as needed
subprocess.call(*args, **kwargs)
这基本上就是这样。函数定义中的*
运算符获取所有输入位置参数,并将它们打包到名为args
的元组中。然后,当您调用子流程
时,*
操作符将该元组解压,以相同的顺序将这些参数传递给下一个函数
**
操作符的工作方式基本相同,只是它捕获像stdout='foo.txt'
这样的关键字参数,并将它们全部打包到像{'stdout':'foo.txt'}
这样的字典中。当您在调用内部函数时再次使用**
时,此字典将被解包并转换回关键字参数。函数NowInCole
只需要一个参数,当您调用它时:
noWinConsole(['myprogram.exe', '-P', arg], stdout=someFile)
您正在传递两个参数:
- 单子
- 关键字参数
stdout=someFile
如何解决此问题?
您可以通过两种方式执行此操作:
- 定义获取kwargs的方法。请注意,您没有使用参数
stdout
def noWinConsole(program, **kwargs):
- 仅通过一个参数调用函数:
noWinConsole(['myprogram.exe', '-P', arg])
函数NowInCole
只需要一个参数,调用时:
noWinConsole(['myprogram.exe', '-P', arg], stdout=someFile)
您正在传递两个参数:
- 单子
- 关键字参数
stdout=someFile
如何解决此问题?
您可以通过两种方式执行此操作:
- 定义获取kwargs的方法。请注意,您没有使用参数
stdout
def noWinConsole(program, **kwargs):
- 仅通过一个参数调用函数:
noWinConsole(['myprogram.exe', '-P', arg])
谢谢你的回答,我用正确的代码更新了问题,你觉得它对吗?@yaka,它似乎适合你的用例,是的。尽管在以后的第一个参数中使用单星解包可能会更清楚。此外,通常不赞成将答案编辑成问题;这会给未来的游客带来麻烦。所以你应该把它去掉。很高兴我能帮忙@是的!实际上,我曾考虑在这里添加对partial
的提及,但我决定反对,因为这与提问者真正需要回答的问题有点相切(“如果函数签名中有参数,Python为什么不自动将任意数量的参数打包到单个参数中”)。谢谢你的回答,我用正确的代码更新了这个问题,你觉得它对吗?@yaka,它似乎适合你的用例,是的。尽管在以后的第一个参数中使用单星解包可能会更清楚。此外,通常不赞成将答案编辑成问题;这会给未来的游客带来麻烦。所以你应该把它去掉。很高兴我能帮忙@是的!实际上,我考虑在这里添加一个对partial
的提及,但我决定反对,因为这与提问者真正需要回答的问题有点相切(“如果函数签名中有参数,Python为什么不自动将任意数量的参数打包到单个参数中”)。