夹在 argparse 和导入函数之间
Caught somewhere between argparse and import function
这是我的问题:
我有一个函数,例如获取一些参数:
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。
下一个奇怪的事情是,当我从我的其他文件 test2.py
中调用此函数 (python3.2 test2.py
) 时,如下所示:
from test.py import testfunc
testfunc(2, 'bar')
returns我:
usage: test2.py [-h] I N [P] [C]
test2.py: error: too few arguments
更新 #1:
当我在 test.py
文件中删除 args = parser.parse_args()
(或对其进行注释)时,import testfunc
起作用。为什么会这样?
更新#2:
我更接近问题的核心(这至少是我想思考的......) - with (in the test.py
):
import sys
print(sys.argv[0])
我得到 test2.py
作为输出,我认为我会得到 test.py
- 所以来自包含的函数的 argparser 仍然认为有命令行参数被推倒了。我该如何防止这种情况发生?
请记住,如果您提供的位置参数多于 'extra' 位置参数按顺序成为关键字参数的定义。
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
如果你用过
print(args)
而不是 testfunc
解析可能更清晰。我希望它显示
Namespace(I=2, N='foo', P='C', C=5)
即把2, foo, C, 5
分别赋值给I, N, P, C
您似乎将 argparse
分配的默认值与 testfunc
关键字参数使用的默认值混合在一起。
我怀疑您希望 C 5
被解释为 'assign 5 to argument labeled C'。但这不是处理位置参数的方式。如果您定义了 -p
和 -c
参数,那么您可以使用:
2 foo -c 5
并获得了所需的行为
这是我的问题:
我有一个函数,例如获取一些参数:
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。
下一个奇怪的事情是,当我从我的其他文件 test2.py
中调用此函数 (python3.2 test2.py
) 时,如下所示:
from test.py import testfunc
testfunc(2, 'bar')
returns我:
usage: test2.py [-h] I N [P] [C]
test2.py: error: too few arguments
更新 #1:
当我在 test.py
文件中删除 args = parser.parse_args()
(或对其进行注释)时,import testfunc
起作用。为什么会这样?
更新#2:
我更接近问题的核心(这至少是我想思考的......) - with (in the test.py
):
import sys
print(sys.argv[0])
我得到 test2.py
作为输出,我认为我会得到 test.py
- 所以来自包含的函数的 argparser 仍然认为有命令行参数被推倒了。我该如何防止这种情况发生?
请记住,如果您提供的位置参数多于 'extra' 位置参数按顺序成为关键字参数的定义。
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
如果你用过
print(args)
而不是 testfunc
解析可能更清晰。我希望它显示
Namespace(I=2, N='foo', P='C', C=5)
即把2, foo, C, 5
分别赋值给I, N, P, C
您似乎将 argparse
分配的默认值与 testfunc
关键字参数使用的默认值混合在一起。
我怀疑您希望 C 5
被解释为 'assign 5 to argument labeled C'。但这不是处理位置参数的方式。如果您定义了 -p
和 -c
参数,那么您可以使用:
2 foo -c 5
并获得了所需的行为