【问题标题】:Use *args without putting the arguments into a tuple?使用 *args 而不将参数放入元组?
【发布时间】:2013-02-28 11:31:11
【问题描述】:

这是我的代码:

def main(*args):
    # The following code will look for arguments and record their start and
    # end positions.
    arg = False
    arg_invalid = False
    arg_start = -1
    arg_end = -1
    i = 1

    print("main args = " + str(args))

...剥离了不相关的代码...

if __name__ == "__main__":
    print("sys args = " + str(sys.argv))
    print("tuple'd args = " + str(tuple(sys.argv)))
    main(sys.argv)

还有输出:

$ ./gmanager.py foo bar 128
sys args = ['./gmanager.py', 'foo', 'bar', '128']
tuple'd args = ('./gmanager.py', 'foo', 'bar', '128')
main args = (['./gmanager.py', 'foo', 'bar', '128'],)

如您所见,在调用main() 之后,main() 将其参数放入一个元组中。我不希望这样,因为它会导致复杂的参数/字符串引用 (arg[x][y][z])。

有没有办法在我的 main() 函数中接受参数作为它们的先前状态,或者我可以从我的参数之外剥离元组?

【问题讨论】:

  • * 前缀可以双向工作:if __name__ == '__main__': main(*sys.argv)
  • 如果这不能回答你的问题,你必须更清楚你想要完成什么。 main() 中的哪些变量需要绑定到sys.argv 的哪些部分?
  • 我的论点是sys.argv 中的任何内容。在他们被叫到main() 之前,他们是一个列表([])。在 main() 中调用它们后,它们是元组 (([])) 中的列表。我只想要清单。
  • 这是一个令人困惑的描述。不要使用散文。创建一个代码示例,显示最终应该是什么的值,即使您不知道如何达到这一点。
  • 哦,我才明白你第一条评论的意思。我没有意识到* 扩展了一个列表——我认为它只是为它腾出了空间。如果您想将其放在答案中,那么我可以投票。

标签: python list python-3.x arguments tuples


【解决方案1】:

要么直接传入列表:

def main(args):
    ...

main(sys.argv)

或使用* 执行参数解包:

def main(*args):
    ...

main(*sys.argv)

后者对于测试很有用,你可以这样写

main('foo', 'arg1', 'arg2')

模拟命令行参数。

【讨论】:

    【解决方案2】:

    由于您只希望main() 有一个参数,并且希望它是list,因此只需去掉def main 中的*,如下所示:

    def main(args):
      print str(args)
    
    if __name__ == "__main__":
      import sys
      main(sys.argv)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-27
      • 2021-04-08
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 2021-05-03
      • 2016-08-20
      相关资源
      最近更新 更多