【问题标题】:Is it possible for a class to define a result for the %d format specifier?类是否可以为 %d 格式说明符定义结果?
【发布时间】: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


【解决方案1】:

使用 %d 运算符打印字符串将不起作用。据我所知,没有内置函数可以改变这一点。然而,如果你想打印一个对象的字符串表示,它们是使用模运算符 (%) 的三种不同方式。

  1. %s - 使用 str() 内置方法返回一个字符串
  2. %r - 使用 repr() 内置方法返回一个字符串
  3. %a - 使用 ascii() 内置方法返回一个字符串

使用这三个,您可以使用相应的 dunber 方法自定义字符串。例如,如果您要使用 %s,它将使用内置的 str() 方法。为了编辑 str() 方法返回的内容,你可以把它放在你的类定义中。

def __str__(self):
    return "String Representation"

python documentation 描述了为什么 %d 不能完美地打印字符串。确保向下滚动到 % 说明所在的位置(大约在页面的一半处。)

【讨论】:

  • 就我而言,一个库(即不是我的代码,也不会更改)正在使用%d 来格式化我提供的输入,我想知道我是否可以潜入特殊值 n /a 表示不可用。这适用于库对提供的值进行的所有计算(因为我为 n/a 编写的类具有 __mul____add__ 方法等(它们都再次返回一个 n/a 对象)。只有百分比格式仍然是个问题。
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多