这是我的问题:
我有一个函数,例如获得一些参数:
import argparse
default_1 = 1
default_2 = [12, 34]
parser = argparse.ArgumentParser()
parser.add_argument("I", type=int)
parser.add_argument("N")
parser.add_argument("P", nargs='?', default=default_2)
parser.add_argument("C", nargs='?', type=int, default=default_1)
args = parser.parse_args()
def testfunc(I, N, ARG1=default_1, ARG2=default_2):
print(I, N, ARG1, ARG2)
testfunc(args.I, args.N, ARG1=args.C, ARG2=args.P)
当我使用
从shell调用它时>>> python3.2 test.py 2 foo
2 foo 1 [12,34]
这是我的预期。但是如果我添加C 5
参数:
>>> python3.2 test.py 2 foo C 5
3 foo 5 C
而不是
3 foo 5 [12, 34]
这当然是因为我用argparse来解决问题。
接下来奇怪的是,当我从我的其他文件python3.2 test2.py
中调用此函数(test2.py
)时,这样:
from test.py import testfunc
testfunc(2, 'bar')
给我回复:
usage: test2.py [-h] I N [P] [C]
test2.py: error: too few arguments
更新#1:
当我在args = parser.parse_args()
文件中删除test.py
(或对其进行评论)时,import testfunc
有效。为什么会这样?
更新#2:
我更接近问题的核心(这至少是我想要的......) - (在test.py
中):
import sys
print(sys.argv[0])
我得到test2.py
作为输出,我认为我会得到test.py
- 所以来自包含函数的argparser仍然认为命令行参数正在被甩掉它的方式。我该如何防止这种情况发生?
答案 0 :(得分:1)
如果您使用
print(args)
而不是testfunc
解析可能更清楚。我希望它能显示
Namespace(I=2, N='foo', P='C', C=5)
也就是说,它分别将2, foo, C, 5
分配给I, N, P, C
。
您似乎将argparse
分配的默认值与testfunc
关键字参数使用的默认值混合使用。
我怀疑您希望将C 5
解释为'将5分配给标记为C的参数'。但这并不是如何对待位置论证。如果您已定义-p
和-c
参数,那么您可以使用:
2 foo -c 5
并获得了理想的行为
答案 1 :(得分:0)
请记住,您提供的定位参数多于“额外”定义的定位参数。位置参数按顺序成为关键字参数。
def function(arg1, arg2=None):
if arg2:
return arg1 + arg2
else:
return arg1
assert function(1, 2) == function(1, arg2=2)
assert function(1) == function(1, 0) == function(1, arg2=0)
assert not '' # Empty string is falsy