我有
fruits = [apple, banana, pineapple, oranges]
sizes = [small, medium, large]
我的代码为每个水果大小的组合生成fruitproperty的文件。 我想尝试这两种方式: (1)编制所有水果大小组合的代码 (2)代码仅针对指定的水果及其三种组合进行编译。
我要求maindir作为强制参数,而水果名称是可选参数
以下是我的代码:
parser = argparse.ArgumentParser(description = " require maindir path and if required fruit name for single compilation")
parser.add_argument('maindir', help = 'Give maindir path', action = 'store')
parser.add_argument("-p","--fruit",help = "Please give fruit name", type=str, default = "apple, banana, pineapple, oranges")
args = parser.parse_args()
print args
fruit =[str(item) for item in args.fruit.split(',')]
sys.argv[1]= os.environ.get(sys.argv[1],sys.argv[1])
def compile()
# Code for creating files for fruitproperty for the given fruit-size combination.
然后我按如下方式调用该函数:
if sys.argv[3] == fruit:
for size in sizes
compile()
else:
for fruit in fruits
for size in sizes
compile()
所以即使我给出了可选参数,我的代码默认编译所有水果大小的组合而不是给定的特定水果大小组合。 我哪里弄错了?
答案 0 :(得分:1)
变量'fruit'是一个列表,但您将其与字符串进行比较:
fruit =[str(item) for item in args.fruit.split(',')]
if sys.argv[3] == fruit: # this will always be False
答案 1 :(得分:1)
几个问题:
在您的第一段代码中,您有一个列表 fruit
,其中包含通过命令行参数传递的水果列表。 如果未指定,则默认值为"apple, pineapple, banana, orange"
。
请注意:fruit
是一个列表。
现在,在这里:
if sys.argv[3] == fruit:
您正在将原始参数(字符串)中的一个与列表进行比较。首先,如果你使用argparse,为什么要直接访问sys.argv?其次,为什么要将字符串与列表进行比较?
此外,这一行:
for fruit in fruits
这个“水果”是阴影(如果范围不同)或覆盖旧的fruit
变量。在这种情况下,你假设用户没有提供这个参数,所以这样做并不重要,但请记住这是令人困惑的 - 你应该真的使用更多的描述性变量!
fruit =[str(item) for item in args.fruit.split(',')]
请注意,默认值为"apple, pineapple, banana, orange"
- 它有空格。所以这里fruit = ["apple", " pineapple", " banana", " orange"]
- 那些空格在那里并将打破字符串比较(如果你要进行任何字符串比较)。建议将此行修改为:
fruit = [str(item).strip() for item in args.fruit.split(',')]
字符串上的 strip()
将摆脱前导和尾随空格。
对于最后一段代码,我建议:
fruits_names = [str(item) for item in fruits]
for arg_fruit in fruit: # for each fruit passed as an argument
if arg_fruit in fruits_names: # check if it's a valid fruit first
for size in sizes: # if it's valid, "compile" for all sizes
compile()
请注意,我完全取出了if语句,因为你有args.fruit
的默认值列出了所有的水果,所以没有你没有args.fruit
值的情况迭代。如果你想依赖“没有水果参数=使用完整列表”,请将水果参数的默认值设置为None
,然后检查if args.fruit is None
。
此外,您的变量命名不佳并使上述代码混淆(阅读上述内容的人可能会问:“等等,fruit
和fruits
变量之间有什么区别?”)。我建议重命名:
这样,很明显其中一些列表是有效值,另一个列表是通过命令行传递的列表。