python - 代码在 python 脚本中生成列表中所有项目的输出

标签 python

我有

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

此外,您的变量命名不当,使上面的代码变得困惑(阅读上面的人可能会问:“等等,fruitfruits 变量之间有什么区别?”)。让我建议重命名:

  • 水果 → valid_fruits
  • 尺寸 → valid_sizes
  • 水果 → arg_fruit_list

这样,很明显其中一些列表是有效值,另一个列表是通过命令行传递的列表。

关于python - 代码在 python 脚本中生成列表中所有项目的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31359735/

相关文章:

python - 如何创建对象,然后在循环中对它们应用方法

Python:os.path.isdir/isfile/exists 不起作用,当它们应该返回 True 时返回 False

python - VS Code 运行 python 比 IDLE 慢 2-3 倍

python - 重新呈现包含错误的表格的技术是什么?

python - 如何通过相邻值分割矩阵?

python - 每次按下一个键时回调函数(不管哪个窗口有焦点)?

python - 初始化多个 Numpy 数组(多重赋值)——类似于 MATLAB deal()

python - 尝试在 Django 中批量删除项目时引发 AttributeError 异常

python - 扁平化嵌套字典,压缩键

python - 傻瓜式 PYPY 安装 - 如何处理 zip 文件