为什么不在字典中调用 input() 时激活?

Why does input() activate when not being called in dictionary?

在我的代码中,我有一个值字典以及一个名为 'custom' 的键,它允许我输入任意值。当我打印 NOT 'custom' 的键值时,它仍然命中 input() 字段:

Ip = {'argon':15.76,
      'neon':21.56,
      'krypton':14.00,
      'xenon':12.13,
      'helium':24.59,
      'hydrogen':15.42,
      'custom': float(input('Enter ionization potential (eV): '))}

print(Ip['argon'], Ip['helium'])

输出:

Enter ionization potential (eV): 1
15.76 24.59

我的印象是键及其相关值在调用之前一直被抑制,但显然我误解了字典的工作原理。

一种快速而肮脏的改进方法是创建一个条件语句,但是(出于某种原因)可能有多个 input() 字典定义,这样我就必须对条件语句进行硬编码为每一个。有没有更 Pythonic 的方式来做到这一点?

def func(key):
    
    if key == 'custom':
        Ip = {key:float(input('Enter ionization potential (eV): '))}

# Is there a way to remove the need for a conditional statement?
    else:
        Ip = {'argon':15.76,
              'neon':21.56,
              'krypton':14.00,
              'xenon':12.13,
              'helium':24.59,
              'hydrogen':15.42}
        
    return print(Ip[key])

func('argon')

输出:

15.76

正在 被调用,如您所知。当您定义 dict 时,会评估调用并将其结果插入 'custom' 下的 dict 中,因此在该示例中,'custom': 1.0。为避免调用,请将其改为函数。

现在提出了一个问题,即如何在字典中混合类型(浮点数和函数)以及如何对函数进行特殊封装。解决这个问题的一种方法是使用两个独立的指令:一个带有浮点数,另一个带有函数。例如:

def func(key):
    ionization_potential = {
        'argon': 15.76,
        'neon': 21.56,
        'krypton': 14.00,
        'xenon': 12.13,
        'helium': 24.59,
        'hydrogen': 15.42}
    functions = {
        'custom': lambda: float(input('Enter ionization potential (eV): '))}
    try:
        v = ionization_potential[key]
    except KeyError:
        f = functions[key]
        v = f()
    return v

演示:

>>> func('argon')
15.76
>>> func('custom')
Enter ionization potential (eV): 1
1.0

最后,如果在任何一个字典中都找不到键,这将从 KeyError 引发 KeyError,所以如果我是你,我会引发 ValueError from None在这种情况下,因为问题出在参数的值上:

try:
    f = functions[key]
except KeyError:
    raise ValueError(f'key not found: {key!r}') from None
v = f()

演示:

>>> func('foobar')
Traceback (most recent call last):
  ...
ValueError: key not found: 'foobar'