【问题标题】:Calling a function with optional parameters [duplicate]使用可选参数调用函数[重复]
【发布时间】:2018-05-04 12:05:51
【问题描述】:

我有一个使用必需参数和一些可选参数的脚本。使用这些可选参数调用函数的最佳方式是什么?

现在我有这些if,但我很确定一定有更好的方法来处理这种情况。否则,如果不是 4 个可选参数,而是 100,我会怎么做(不好的做法,仅用于示例)?每个人都使用if

def get_data(table, db='postgres', host='localhost', user='postgres', password=''):
....
....
....

kwargs = {}
if args.db:
    kwargs['db'] = args.db
if args.host:
    kwargs['host'] = args.host
if args.user:
    kwargs['user'] = args.user
if args.password:
    kwargs['password'] = args.password


data = get_data(args.table, **kwargs)

【问题讨论】:

  • 所有ifs 正在做的是将args 转换为kwargs。这不能用**args...完成吗?
  • @deceze args 是 argparse parse_args() 的输出。如果我尝试直接使用它,它会显示argument after ** must be a mapping, not Namespace
  • 使用get_data(**vars(args))
  • @Aran-Fey 这是不对的,除非 OP 在参数解析器中指定与 get_data 相同的默认值。 OP 不想覆盖函数默认值。
  • @AlexHall 我猜是的,但我将问题解释为“将args 对象转换为字典的更聪明的方法是什么”,而vars 绝对足够了。之后过滤掉None 值很容易。我添加了一个相关的骗子,这是一段懒惰的代码:get_data(**{k:v for k,v in vars(args).items() if v is not None})

标签: python python-3.x


【解决方案1】:
for key in 'db host user password'.split():
    val = getattr(args, key)
    if val:
        kwargs[key] = val

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 2019-08-20
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    相关资源
    最近更新 更多