我正在学习Python字符串format()
方法。虽然我知道{}
是参数的占位符,但我不确定:
在Programiz教程中的以下代码片段中表示什么:
import datetime
# datetime formatting
date = datetime.datetime.now()
print("It's now: {:%Y/%m/%d %H:%M:%S}".format(date))
# custom __format__() method
class Person:
def __format__(self, format):
if(format == 'age'):
return '23'
return 'None'
print("Adam's age is: {:age}".format(Person()))
- 为什么
print("It's now: {:%Y/%m/%d...
中%Y
前面有:
?代码输出It's now: 2021
, 2021前无:
。 - 为什么
print("Adam's age is: {:age}...
中age
前面有:
?
提前感谢您的宝贵意见!!
:
之后的所有内容都是对应实参的类的__format__()
方法的参数。例如,对于一个数字,您可以编写{:.2f}
将其格式化为小数点后精度为2位的十进制数。
对于datetime
值,它是一个可以与datetime.strftime()
一起使用的格式字符串。
在Person
类中,它将作为format
参数传递给Person.__format__()
。所以如果你不把:age
放在那里,if
条件将失败,它将打印None
而不是23
。
Python对象自己决定如何使用__format__
方法格式化它们。大多数情况下,我们只使用基本类型自带的默认值,但就像__str__
和__repr__
一样,我们可以自定义。冒号:
后面的部分是__format__
的参数。
>>> class Foo:
... def __format__(self, spec):
... print(repr(spec))
... return "I will stubbornly refuse your format"
...
>>> f = Foo()
>>> print("Its now {:myformat}".format(f))
'myformat'
Its now I will stubbornly refuse your format
我们可以自己调用格式化器。datetime
使用strftime格式规则。
>>> import datetime
>>> # datetime formatting
>>> date = datetime.datetime.now()
>>> print("It's now: {:%Y/%m/%d %H:%M:%S}".format(date))
It's now: 2021/10/04 11:12:23
>>> date.__format__(":%Y/%m/%d %H:%M:%S")
':2021/10/04 11:12:23'
您的自定义Person
类实现了__format__
,并使用冒号后的格式说明符返回值。
尝试f-strings。在它们中,结肠似乎更合理。它分隔变量名及其格式化选项:
import datetime
# datetime formatting
date = datetime.datetime.now()
print(f"It's now: {date:%Y/%m/%d %H:%M:%S}")
# custom __format__() method
class Person:
def __format__(self, format):
if(format == 'age'):
return '23'
return 'None'
print(f"Adam's age is: {Person():age}")
顺便说一句,您可以使用format()
的关键字参数实现类似的功能:
print("It's now: {d:%Y/%m/%d %H:%M:%S}".format(d=date))
print("Adam's age is: {adam:age}".format(adam=Person()))