我有
fruits = [apple, banana, pineapple, oranges]
sizes = [small, medium, large]
我的代码为每个水果大小组合生成水果属性文件。 我正在尝试通过两种方式做到这一点: (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()
因此,即使我给出可选参数,我的代码默认情况下也会针对所有水果大小组合进行编译,而不是针对给定的特定水果大小组合进行编译。 我哪里理解错了?
最佳答案
几个问题:
在第一段代码中,您有一个列表 fruit
,其中包含通过命令行参数传递的水果列表。 如果未指定,则默认为“苹果、菠萝、香蕉、橙子”
。
请记住:fruit
是一个列表。
现在,这里:
if sys.argv[3] == fruit:
您正在将一个原始参数(字符串)与列表进行比较。首先,如果您使用argparse,为什么要直接访问sys.argv?其次,为什么要将字符串与列表进行比较?
另外,这一行:
for fruit in fruits
这个“fruit”正在隐藏(如果范围不同)或覆盖旧的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
变量之间有什么区别?”)。让我建议重命名:
- 水果 → valid_fruits
- 尺寸 → valid_sizes
- 水果 → arg_fruit_list
这样,很明显其中一些列表是有效值,另一个列表是通过命令行传递的列表。
关于python - 代码在 python 脚本中生成列表中所有项目的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31359735/