我在Python3中有一个列表,其中包含两个变量,这些变量包含通过argparse设置的值:
start = set by user cli argument
end = set by user cli argument
arguments=[start,end]
print (arguments[0])
print (arguments[1])
这当前只是给出用户通过命令行设置的开始和结束的整数值,但我还想打印变量名。我怎样才能做到这一点?最终我试图检查变量是否已由用户通过cli设置。我有一个for循环来遍历用户可能设置的所有可用参数。
arguments=[start,end]
print (arguments[0]) //This (test) returns the integer the user set
print (arguments[1]) //This (test) returns the integer the user set
for x in arguments:
if results.arguments[x] is not None: //results.start and results.end are the variables coming from argparse
print ('User has set argument values via the CLI... Do something here.') //This is where I would actually use the integer value of arguments[x], but above in the if statement, I need the variable string from the array element.
else:
print ('User did not specify any arguments via the CLI. Pull the values from the config file.')
**示例**
user@taco# python3 program.py -s 100 -e 1000
用户运行程序并指定起始值100和结束值1000
parser = argparse.ArgumentParser(description='Taco help menu', add_help=True)
parser.add_argument('-s', '--start', dest='start', action='store', help='enter the starting <value>', metavar='<value>')
parser.add_argument('-e', '--end', dest='end', action='store', help='enter the ending <value>', metavar='<value>')
results = parser.parse_args()
arguments=[start,end]
让我们检查一下打印命令的位置
print (arguments[0]) // Should output 100
print (arguments[1]) // Should output 1000
print (results.start) // Should also output 100
print (results.end) // Should also output 1000
现在我们需要检查用户是否设置了参数。为此,请检查results.start和results.end是否设置为None。我们需要一个for循环来迭代所有可能的参数。目前只有两个(开始和结束),但谁知道,以后可能会有更多。
for x in arguments:
if results.arguments[x] is not None:
print ('User has set argument values via the CLI... Do something here.') //This is where I would actually use the integer value of arguments[x], but above in the if statement, I need the variable string from the array element.
else:
print ('User did not specify any arguments via the CLI. Pull the values from the config file.')
*更新*
好的,我取得了一些进展,并且让一些事情让人困惑。我想我已将它缩小到只有一个单一的现在不同的问题。使用for循环迭代变量来获取数组元素。请参阅下面的完整代码和当前的错误消息。注意!!!如果我删除for循环并只是手动指定元素编号,一切正常。
parser = argparse.ArgumentParser(description='Taco help menu', add_help=True)
parser.add_argument('-s', '--start', dest='start', action='store', help='enter the starting <value>', metavar='<value>')
parser.add_argument('-e', '--end', dest='end', action='store', help='enter the ending <value>', metavar='<value>')
results = parser.parse_args()
arguments=[results.start,results.end]
print (arguments[0])
print (arguments[1])
print (results.start)
print (results.end)
for x in arguments:
if arguments[x] is not None: // <-- This line seems to be the issue now. arguments[x] not working.
print ('CLI set')
else:
print ('Default config')
以下是我收到的当前错误消息:
user@taco# python3 program.py -s 100 -e 1000
100
1000
100
1000
Traceback (most recent call last):
File "program.py", line 38, in <module>
if arguments[x] is not None:
TypeError: list indices must be integers or slices, not str
*更新*
顺便说一下......这个(下面)在技术上解决了这个问题,只是首先避开它哈哈。当然,现在每次向程序添加新参数时,也必须手动添加此列表。不理想。仍然想知道这个循环问题。
if results.start:
start = results.start
if results.end:
end = results.end
现在,当您通过CLI设置参数时,它优先于配置文件中的值。
答案 0 :(得分:1)
您正尝试使用值而非密钥访问列表,这在极少数情况下可能有效。由于for是针对每个循环的,因此您已经迭代了列表中的项目。
这是错误的,x并不意味着关键而不是项目本身,如果你试图写一个&#34;常规&#34;对于循环,您需要迭代列表的长度,而不是像获取任何其他语言那样获取每个键的项目:
Wrong:
for x in arguments:
if arguments[x] is not None:
foreach
for x in arguments:
if x:
# Do stuff
else:
# Do other stuff
这样的appraoch可能会更容易。
import argparse
def import_config():
return {
"start": 10,
"end": 100
}
def do_stuff(start, end):
print(start, end)
if __name__=="__main__":
config = import_config()
parser = argparse.ArgumentParser()
parser.add_argument("-s", type=int, dest="start", default=config["start"])
parser.add_argument("-e", type=int, dest="end", default=config["end"])
args = parser.parse_args()
do_stuff(args.start, args.end)
答案 1 :(得分:0)
在python中,当用户在输入()中输入任何内容时,我认为你必须使用的是cli输入,其中存储的默认值是&#39;&#39;。 所以我只是建议检查变量是否未设置为None类型或空字符串,这可以这样做。
if start:
#logic here
希望这会有所帮助:)