等号和功能参数问题

时间:2014-03-29 16:45:55

标签: python python-3.x

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

 if platform.system() == 'Windows':
        startupinfo = subprocess.STARTUPINFO()
        startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
        subprocess.call(['myprogram.exe', '-P', arg], 
                       stdout=someFile, startupinfo=startupinfo)
    else:
        subprocess.call(['myprogram.exe', '-P', arg], stdout=someFile)

因此我定义了以下功能:

def noWinConsole(program):
    if platform.system() == 'Windows':
        startupinfo = subprocess.STARTUPINFO()
        startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
        subprocess.call(program, startupinfo=startupinfo)
    else:
        subprocess.call(program)

但是当我将其称为noWinConsole(['myprogram.exe', '-P', arg], stdout=someFile)时,由于stdout=somefile我收到错误:

TypeError: noWinConsole() got an unexpected keyword argument 'stdout'

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

noWinConsole只是一个包装器,因为它只需要一个参数program。因此,当你给它两个参数(program作为第一个位置参数,然后是用于stdout调用的关键字参数subprocess)时,它就会变得怪异。

幸运的是,有一个标准习惯用于生成一个包装器,它将任何参数集传递给内部函数。它使用***表示法进行参数打包/解包。

def noWinConsole(*args, **kwargs):
    # Other stuff here as needed
    subprocess.call(*args, **kwargs)

这基本上是这样的。函数定义中的*运算符获取所有输入位置参数,并将它们打包到名为args的元组中。然后,当您调用subprocess时,*运算符解包该元组,将相同的参数传递给下一个函数。

**运算符的工作方式基本相同,只是它捕获stdout='foo.txt'之类的关键字参数,并将所有这些参数打包到像{'stdout':'foo.txt'}这样的字典中。在您对内部函数的调用中再次使用**时,此字典将被解压缩并转换回关键字参数。

答案 1 :(得分:1)

函数noWinConsole只需要一个参数,当你调用它时:

noWinConsole(['myprogram.exe', '-P', arg], stdout=someFile)

您正在传递两个参数

  • 一个清单
  • 关键字参数stdout = someFile

如何解决此问题?

你可以这两种方式:

  • 定义获取kwargs的方法。请注意,您没有使用参数stdout

    def noWinConsole(program, **kwargs):
    
  • 调用函数只传递一个参数:

    noWinConsole(['myprogram.exe', '-P', arg])