Python中为什么不同的格式化方法表现不同?

4
我是一名有用的助手,可以为您翻译文本。
我是一个初学者,正在学习Python。最近我学习了格式化方法、字典等知识。目前我正在学习for循环,并发现了一个叫做enumerate的函数(可能与这个问题无关)。我正在将我学到的东西混合起来应用。突然间,我发现两个格式化方法的行为不同!为什么会出现这种情况?请解释一下。 方法1:
nameAgeDictionary = {'Jack': 38, 'John': 51, 'Alex': 13, 'Alvin': 'Not Available'}

for index, name in enumerate(nameAgeDictionary):
    print('(%d) Name = %s, Age = %s' % (index+1, name, nameAgeDictionary[name]))  # Format_Method_1

输出结果:

(1) 姓名 = Jack,年龄 = 38

(2) 姓名 = John,年龄 = 51

(3) 姓名 = Alex,年龄 = 13

(4) 姓名 = Alvin,年龄 = 不可用

方法二:

nameAgeDictionary = {'Jack': 38, 'John': 51, 'Alex': 13, 'Alvin': 'Not Available'}

for index, name in enumerate(nameAgeDictionary):
    print('({0:d}) Name = {1:s}, Age = {2:s}'.format(index+1, name, nameAgeDictionary[name])) # Format_Method_2

输出:

Traceback (most recent call last): File "PATH_to_File.py", line 3, in

print('({0:d}) 名称 = {1:s},年龄 = {2:s}'.format(

ValueError: 未知格式代码“s”,适用于类型为“int”的对象

我尝试将d放在s的位置,这种情况下,它会打印前三行并在最后一行卡住(例如:不可用)。


1
2.4.3. 格式化字符串字面量。您可以使用 ! 强制转换为 strprint('({0:d}) Name = {1:s}, Age = {2!s}'.format(index+1, name, nameAgeDictionary[name])) - Henry Ecker
谢谢!它起作用了!但是,正如user_na的答案所假设的那样,与.format()不同,%格式化调用__str__作为后备。你对此有什么看法?我问你这个问题,因为user_na并不完全确定原因。 - Pritam
1个回答

4

由于年龄的类型是混合的(strint),所以不需要指定类型。

for index, name in enumerate(nameAgeDictionary):
    print('({0:d}) Name = {1:s}, Age = {2}'.format(index+1, name, nameAgeDictionary[name])) # Format_Method_2

通过这样做,应该调用输入的 __str__ 方法, 安全地将 int 转换为 str。结果是:
(1) Name = Jack, Age = 38
(2) Name = John, Age = 51
(3) Name = Alex, Age = 13
(4) Name = Alvin, Age = Not Available

我认为(但我不完全确定),与.format()相比,%格式化调用__str__作为回退。

更新

这里是证明%格式化调用__str__的证据:

class test():
     def __str__(self):
         return 'bar'
 
foo = test()
print('%s'%(foo))

打印

bar

谢谢!这个完全正常工作了!但我仍然不明白这件事:为什么在方法1中,即使将类型指定为字符串(例如使用%s),它仍然可以正常工作? 为什么方法1没有显示Method 2给我的错误? - Pritam
就像我之前所说的,我认为第一个函数在输入不符合指定字符串时会调用__str__,而第二个函数则没有处理这个错误。 - user_na
哦!Accha,现在我开始理解可能导致这种行为差异发生的原因了。非常感谢@user_na反复阐述这一点 :-) - Pritam
哇,太棒了!非常感谢您的帮助 @user_na,如果没有您的帮助,这个问题可能会一直困扰我。 - Pritam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接