【发布时间】:2021-01-05 21:05:11
【问题描述】:
我有一个类A 的实例作为值传递给使用% 运算符在字符串格式中的格式说明符%d。如果没有任何准备,这将导致以下错误消息:TypeError: %d format: a number is required, not A:
class A: pass
'%d' % A()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: %d format: a number is required, not A
如果类 A 定义了一个名为 __int__ 的方法,则会调用它:
class A:
def __int__(self): return 42
'%d' % A()
'42'
在我的用例中,我希望使用%d 的格式为我的类的实例创建一个字符串表示,它看起来不像一个数字(而是像n/a、²³ 或类似的任意字符串)。
这可能吗?
我正在考虑在 __int__ 方法中返回另一个特殊对象,但这导致了一个警告(只允许返回基本整数,其他任何东西在以后的版本中都可能变得非法;我正在尝试使用 Python 3.7.4,顺便说一句) 最终没有成功。
我知道将__format__ 方法与'{0}'.format(a) 格式化字符串的方法结合使用是一件容易的事,但这不是我想要的。我专门询问在与% 运算符一起使用的格式化字符串中使用%d 说明符进行格式化。
【问题讨论】:
-
不,没有提供。
%d显式 表示“将值转换为整数,然后将整数值插入到字符串中”;这个逻辑是在%运算符本身内实现的。这种不灵活是不使用这种古老格式化技术的众多原因之一:) -
您在问如何在语言定义中编写矛盾代码。这非常类似于询问如何使整数类型的变量保存字符串值。这不是它的设计初衷,违反了它的基本存在。
-
@Prune 我看不出这与任何事情相矛盾的理由。可能只是如果
%d应用于用户定义的对象,则要求该对象的特殊方法来完成这项工作(例如__percent_format__(specifier))。这种方式与更现代的.format()一起使用,我认为没有理由不使用旧的%运算符格式。事实上,它甚至可以在今天添加。它仍然不会与任何东西相矛盾。
标签: python string class formatting