打印Python3列表元素的内容而不是值

时间:2018-04-04 05:54:17

标签: python python-3.x

我在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设置参数时,它优先于配置文件中的值。

2 个答案:

答案 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

希望这会有所帮助:)