【问题标题】:Python: use a dict with lambda functions when using .format() on a stringPython:在字符串上使用 .format() 时使用带有 lambda 函数的 dict
【发布时间】:2020-11-08 09:53:37
【问题描述】:

设置是:我有一个 dict (format_dict),并且在那个 dict 中有 lambda 函数。如果我想正常读取字典,它不会像这样工作:

    dict = {
    'name_U':  (lambda: name.upper()),
    'name_L':  (lambda: name.lower()),
    'name_fL': (lambda: name[0])
    }
    name = 'John'
    print(dict['name_U'])

因为它返回:

<function <lambda> at 0x00000000E1F45012>

但如果我改为使用print(dict['name_U']()),它会按预期工作(打印JOHN)。

当我想使用这个字典来格式化一个字符串时,问题就来了。如果是这样:

    print('My name in uppercase is {name_U}. The first letter is {name_fL}.'.format(**dict))

返回

My name in uppercase is <function <lambda> at 0x00000000E1F45012>. The first letter is <function <lambda> at 0x00000000E1F46123>.

(我希望输出为My name in uppercase is JOHN. The first letter is J.

如果我尝试在“正常”情况下 (...format(**dict()))) 执行的操作,它会返回错误,提示 TypeError: 'dict' object is not callable。有什么办法可以规避吗?

附带说明:我不能将字典用作

    dict = {
    'name_U':  name.upper(),
    'name_L':  name.lower(),
    'name_fL': name[0]
    }

因为这样 dict 的值在赋值后将是相同的,即使 name 改变了值。

【问题讨论】:

  • print(f'my name in uppercase is {dict["name_U"]()}. The first letter is {dict["name_fL"]()}') --&gt; my name in uppercase is JOHN. The first letter is J

标签: python-3.x dictionary lambda


【解决方案1】:
dct = {
'name_U':  (lambda: name.upper()),
'name_L':  (lambda: name.lower()),
'name_fL': (lambda: name[0])
}

name = 'John'

print('my name in uppercase is {name_U}. The first letter is {name_fL}.'.format(**{k: v() for k, v in dct.items()}))

打印:

my name in uppercase is JOHN. The first letter is J.

或者使用 f-strings,比如 cmets。

【讨论】:

    【解决方案2】:

    使用f-strings

    In [57]: dict = {
        ...: 'name_U':  (lambda: name.upper()),
        ...: 'name_L':  (lambda: name.lower()),
        ...: 'name_fL': (lambda: name[0])
        ...: }
    
    In [58]:
    
    In [58]: print(f'my name in uppercase is {dict["name_U"]()}. The first letter is {dict["name_fL"]()}')
    my name in uppercase is JOHN. The first letter is J
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 2016-02-29
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多