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

代码在python脚本中为列表中的所有项生成输出,python,Python,我有 我的代码为每个水果大小组合的水果属性生成文件。 我尝试用两种方法来实现这一点: (1) 代码将针对所有水果大小组合进行编译 (2) 代码将只针对指定的水果及其三种组合进行编译 我需要maindir作为强制参数,而fruit name是可选参数 以下是我的代码: fruits = [apple, banana, pineapple, oranges] sizes = [small, medium, large] 然后我调用函数,如下所示: parser = argparse.Argumen

我有

我的代码为每个水果大小组合的水果属性生成文件。 我尝试用两种方法来实现这一点: (1) 代码将针对所有水果大小组合进行编译 (2) 代码将只针对指定的水果及其三种组合进行编译

我需要maindir作为强制参数,而fruit name是可选参数

以下是我的代码:

fruits = [apple, banana, pineapple, oranges]
sizes = [small, medium, large]
然后我调用函数,如下所示:

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. 
所以,即使我给出可选参数,我的代码在默认情况下也是为所有水果大小的组合编译的,而不是为给定的特定水果大小的组合编译的。
我哪里弄错了

变量'fruit'是一个列表,但可以将其与字符串进行比较:

if sys.argv[3] == fruit: 
   for size in sizes
       compile()
else: 
   for fruit in fruits
       for size in sizes
           compile() 
几个问题:

在第一段代码中,您有一个列表
水果
,其中包含通过命令行参数传递的水果列表如果未指定,则默认值为
“苹果、菠萝、香蕉、橘子”

记住:
水果
是一个列表

现在,这里:

fruit =[str(item) for item in args.fruit.split(',')]
if sys.argv[3] == fruit: # this will always be False
您正在将一个原始参数(字符串)与列表进行比较。首先,如果使用argparse,为什么要直接访问sys.argv?第二,为什么要将字符串与列表进行比较

此外,这一行:

if sys.argv[3] == fruit: 
此“果”是阴影(如果范围不同)或覆盖旧的
变量。在这种情况下,您假定用户没有提供此参数,因此这样做并不重要,但请记住,这会让您感到困惑,您真的应该使用更多描述性变量

for fruit in fruits
请注意,默认值是“苹果、菠萝、香蕉、橘子”——它有空格。所以这里的
fruit=[“苹果”、“菠萝”、“香蕉”、“橘子”]
-这些空格在那里,将中断字符串比较(如果要进行任何字符串比较)。建议将此线路固定到:

fruit =[str(item) for item in args.fruit.split(',')]
字符串上的
strip()
将去掉前导和尾随空格

对于最后一段代码,我建议:

fruit = [str(item).strip() for item in args.fruit.split(',')]
请注意,我完全去掉了if语句,因为您有一个列出所有水果的
args.fruit
的默认值,所以在任何情况下都不会有一个
args.fruit
值需要迭代。如果您希望依赖“no fruits argument=使用完整列表”,请将fruit参数的默认值设置为
None
,并检查args.fruit是否为None

此外,您的变量名称不正确,使上述代码混淆(阅读上述内容的人可能会问:“等等,
fruit
fruits
变量之间有什么区别?”。让我建议重命名:

  • 果实→ 有效水果
  • 尺寸→ 有效尺寸
  • 果→ arg_水果列表

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

help=“请给出水果名”
-引号不平衡,这是否存在于原始代码中?是的。print args提供名称空间(maindir=maindir,fruit=apple)但是代码可以为所有水果编译。谢谢。我试过你的代码。但是它不起作用,现在它甚至不能编译。你是否像我提到的那样通过在列表理解中调用strip解决了空格问题?这似乎是第一个明显的问题。按原始名称打印两个水果列表(
水果
水果
)并检查列表中的字符串是否匹配-如果不匹配,
if arg_fruit in fruits
行每次都会失败。此外,如果重命名了任何变量,请确保没有出现任何错误!是的,我正在使用strip()并打印出以下输出:print args:Namespace(maindir='maindir',fruit='apple'),打印水果给['apple',打印水果=['apple','banana','菠萝','oranges'].我没有改变任何变量,保持原样。那里一切看起来都很好。你能一步一步地遍历循环吗,或者只是在每个块上添加打印语句,然后检查它是否正在输入它应该输入的位置?你希望在for循环的一次且唯一的迭代中,
arg\u fruit='apple'
,并且让程序输入
if
语句,然后迭代内部for循环中的所有三个
size
值。如果所有这些都正确,请检查
compile()
函数在更改后是否正确(为什么它没有参数?).非常感谢。所以当我打印arg_水果时,当它应该打印apple时,它是否会以o或n g e的形式输出奇怪的结果(都是垂直的)。会有什么问题?
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()