使用混合字符串和数字的元组快速格式化 print() 调用中的数字

Quickly formatting numbers in print() calls with tuples mixing strings and numbers

在我的代码中编写快速代码注释和解决问题时,我经常给自己写注释,当到达我的代码的某些部分时,这些注释将被打印出来。这些笔记通常会计算一些变量,我打印这些变量是为了检查是否是 WAI。我发现,编写这些内容的最快、最直观的方法是混合字符串和变量的元组(通常指 integers/floats)。例如:

>>> val1=4
>>> val2=6
>>> print('The first value shows',val1,'but the second value gives',val2)
The first value shows 4 but the second value gives 6

有时我有非常大的值,或者有很多小数的值。我想让这些更具可读性。例如:

>>> val1=4.351324*10**8
>>> val2=6.2151234623431435235
>>> print('The first value shows',val1,'but the second value gives',val2)
The first value shows 435132400.0 but the second value gives 6.2151234623431435

但我更愿意做的是格式化这些数字,以便语句变得更易读。我希望它 return 像这样:

The first value shows 435,132,400 but the second value gives 6.215

我插入逗号并将第一个值设为整数(如果它是整数),第二个值四舍五入到小数点后 3 位。当然,这可以使用字符串格式来完成,但我发现这很乏味 - 特别是对于我只是用来解决问题(而不是用于生产目的)的语句。要获得预期的结果,我必须执行以下操作:

>>> print('The first value shows {0:,} but the second value gives {1:5.3f}'.format(int(val1),val2))

但这有几个缺点:

  1. 这可读性较差。按时间顺序阅读“'The first value shows',val1,...”非常简单。使用 .format 方法需要我在末尾包含我的变量元组,并花更多时间思考什么值会去哪里。当我写这些行时,我通常是在尝试解决问题,而不是对创建其他潜在错误点感兴趣。
  2. 正如我之前提到的,这很乏味。繁琐的任务是代码的用途,所以我希望能够在某个地方设置数字格式,然后调用它。如果数字 returned 出乎意料(这在我搜索错误时绝对有可能),这一点尤其重要。例如,我可能希望一个数字是一个整数,但它是一个浮点数。如果我把它格式化成一个整数,我会错过这个问题而找不到我的错误。

理想情况下,我有一种格式可以应用于打印元组中的每个数字,这是某种 if/then 语句。例如:对于数字 n,如果 n 是整数,则使用格式 f1,如果 n 是浮点数,则使用格式 f2,如果 [=19] =] 使用科学记数法 (f3),如果 n 较小且非零,但使用 f2 时显示为零,则使用科学记数法。对于给定打印函数中的所有数字都可以调用它,或者可以在整个文档中应用它。

如果用 if/then 序列来处理任何数字情况是不可能的,我也愿意将其中一个应用于元组中的所有值(例如:使用逗号分隔符)而不必单独格式化每个数字。

就目前而言,我宁愿速度快也不愿格式正确(因此我不对这类笔记进行格式设置),但我愿意两者兼顾。这可能吗?

from typing import Any

def standarize(value: Any) -> str:
    if type(value) == int:
        return str(value)
    elif type(value) == float:
        return f'{value:.2f}'
    else:
       return str(value)
    
print(f'Value int: {standarize(1)}')
print(f'Value float: {standarize(113.91715)}')
print(f'Value str: {standarize("any string")}')