【问题标题】:Conditional arguments in Python function callPython函数调用中的条件参数
【发布时间】:2017-05-24 15:19:59
【问题描述】:

有没有办法在 Python 中有条件地传递参数(我使用 Python 2.7)?

例如,此代码给出 2 个或 3 个参数,具体取决于字典中是否存在第三个参数。

if "arg3" in my_dict:
    my_method(
        my_dict[arg1],
        my_dict[arg2],
        my_dict[arg3],
    )
else:
    my_method(
        my_dict[arg1],
        my_dict[arg2],
    )

我认为这样写是多余的。我在argparse 上看到了一些信息,我认为应该是这样的:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument(my_dict[arg1])
parser.add_argument(my_dict[arg2])
if arg3 in my_dict:
    parser.add_argument(my_dict[arg3])
args = parser.parse_args()

my_method(args)

我也不太喜欢这种方法,因为它需要导入并且难以阅读。

有没有办法做类似的事情:

my_method(
    my_dict[arg1],
    my_dict[arg2],
    my_dict[arg3] if arg3 in my_dict,
)

或者我想念的任何其他方式,这将是简单和干净的?

【问题讨论】:

    标签: python python-2.7 if-statement coding-style arguments


    【解决方案1】:

    假设你的方法签名是

    def my_method(arg1=None, arg2=None, arg3=None):
        print ('arg1',arg1,'arg2',arg2,'arg3',arg3)
    

    然后简单地将所有 if/else 块替换为

    my_method(**dictionary)
    

    例如

     d = {'arg3':11, 'arg2':22, 'arg1':3}
    

    上面会产生

    arg1 3 arg2 22 arg3 11
    

    这种行为是由**kwargs 带来的,网上有很多很好的教程。这是digial ocean的一个(我不是附属的)

    【讨论】:

    • 考虑到dictionaries 没有被排序,这如何工作?
    • 这就是kwargs的本质
    • @Ev.Kounis 它取决于与dict 键同名的关键字参数,在这种情况下,您提供关键字参数的顺序无关紧要。不过,这个答案很大程度上取决于my_method 的定义方式。
    • 哦,我明白了。所以函数变量必须与字典键相同。不错!
    • 我非常喜欢你的回答,它符合我的问题,但实际上我在通话中也有来自my_dict 之外的参数,所以这个解决方案对我不起作用,而.get(arg3, None) 将始终有效。
    【解决方案2】:

    你可以这样称呼它:

    my_method(my_dict[arg1], my_dict[arg2], my_dict.get(arg3, None))
    

    您可能需要更改my_method 以适应这种情况;也许像def my_method(*args): 这样的东西。

    有关.get() 字典方法的更多信息,请查看this

    此解决方案绝对比@e4c5 提供的解决方案(符合 Pythonic 的美标准),但不需要函数变量与字典键具有相同的名称。

    【讨论】:

      【解决方案3】:

      @Ev.Kounis 和 @e4c5 都提供了很好的答案。就您在问题中所做的尝试而言,您只缺少一个有效的条件表达式。

      my_method(
          my_dict[arg1],
          my_dict[arg2],
          my_dict[arg3] if arg3 in my_dict else None,
      )
      

      实际上,这与@Ev.Kounis 提议的相同。

      【讨论】:

        【解决方案4】:

        作为替代方案,如果您知道每次都会传入一个字典,我会考虑更改 my_method 以接收一个字典。

        def my_method(d):
            a1 = d[arg1]
            a2 = d[arg2]
            a3 = d[arg3] if 'arg3' in d else None
            ...
        

        否则,其他答案也有效。

        【讨论】:

          猜你喜欢
          • 2021-02-26
          • 2019-04-13
          • 2018-08-26
          • 2022-07-06
          • 2012-12-09
          • 1970-01-01
          • 2011-07-09
          • 2021-02-21
          • 1970-01-01
          相关资源
          最近更新 更多