Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有等号和功能参数的问题_Python_Python 3.x - Fatal编程技术网

Python 具有等号和功能参数的问题

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

我正在尝试构建一个允许重复此操作的函数(它阻止控制台在windows中打开):

因此,我定义了以下函数:

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为什么不自动将任意数量的参数打包到单个参数中”)。