【问题标题】:Can I use the value of a variable as a parameter name for a function?我可以将变量的值用作函数的参数名称吗?
【发布时间】:2016-05-03 21:27:47
【问题描述】:

有许多 StackOverflow 问题询问关于将变量用作变量(例如 thisthis,但我不认为这是重复的。我想要知道我是否可以将变量的值用作函数参数。

例如,假设我想调用一个函数来填充两个不同的 MySQL 表之一:

  • name 表的列是idfullname
  • phone 表的列是idphonenum
data = get_data()                 # data = a full name or a phone number
data_type = get_data_type(data)   # data_type = "name" or "phone"
....
column_names_for_tables = {'name': 'fullname', 'phone': 'phonenum'}
column_name = column_names_for_tables[data_type]
# column_name now = "fullname" or "phonenum", depending on the value of #data

new_entry = MakeNewEntry(date=datetime.datetime.now(), id=123, <column_name>=data)

当然最后一行不是有效的 Python,但我的目标是动态生成函数调用:

new_entry = MakeNewEntry(date=datetime.datetime.now(), id=123, fullname=data)

new_entry = MakeNewEntry(date=datetime.datetime.now(), id=123, phonenum=data)

也就是说,我想用column_name的值作为我的参数名。

我可以这样做吗?

(对于本例,请假设 MakeNewEntry() 不在我的控制之下 - 它将接受 dateidphonenumfullname 参数,但无法重构。)

【问题讨论】:

    标签: python parameters expression parameter-passing


    【解决方案1】:

    您可以使用double star operator 将任意参数传递给函数:

    col = 'foo'
    val = 'bar'
    kwargs = {col: bar}
    
    some_function(**kwargs)
    

    您可以通过像这样内联字典来缩短它:

    some_function(**{col: var})
    

    您可以混合和匹配语法并最终得到如下内容:

    MakeNewEntry(date=datetime.datetime.now(), id=123, **{column_name: data})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 2017-12-19
      • 2014-04-03
      • 2017-02-27
      • 1970-01-01
      相关资源
      最近更新 更多