Skip to main content

Python 3.6 f-string 对 Python 2.7 的同情。现在使用 printf()

项目描述

用于 Python 2.7 的 Python 3.6 f-string 同情(部分兼容性)模块 有关Literal String Interpolation的规范,请参见https://www.python.org/dev/peps/pep-0498/

来自 PEP-0498 的示例

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."

fstring427 的同情输出

>>> from fstring427.fstring import Fmt as f
>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991,10,12)
>>> str(f('My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'))
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>>  f('He said his name is {name!r}')()
"He said his name is 'Fred'"

注意主要区别:

  • f是一个类,而不是字符串类型

  • f()计算字符串

  • f实例的 str()也计算字符串

底层实现是 Python 2.7 Format 类的子类,依赖于内部。显然很脆弱,可能不便携,但仍然符合我的目的。

## printf(),一个方便的函数

>>> printf('他说他的名字是{name!r}') 他说他的名字是 'Fred'

它具有 kwargs 临时范围的额外便利

 >>> printf('He said his name is {name!r}', name="Sam")
He said his name is 'Sam'

主要不兼容性

Python 3.6 f 字符串经过精心设计,涵盖了 .format() 没有的边缘情况,请参阅 https://mail.python.org/pipermail/python-ideas/2015-July/034726.html

fstring427 在 .format() 之上实现并共享查找的底层实现。如果 .format() 无法处理{field}, fstring427 将在适当的范围内将字段评估为 Python 表达式。在实践中,这意味着:

a = 10
d = {'a': 'string', 10: 'int'}
printf("{d[a]")

打印字符串(Python 2.7 .format() 行为)而不是int (Python 3.6 f 字符串行为)。我发现在我的 2.7 代码中要付出很小的代价才能获得更清晰的打印和字符串格式。

路线图

  • 添加printf()样式日志模块

  • 考虑 printf() 实用函数的 2-3 端口(处理 kwargs 范围)

版权所有 2017, Smartvid.io

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

fstring427-0.9.9.tar.gz (3.6 kB 查看哈希

已上传 source

内置分布

fstring427-0.9.9-py2-none-any.whl (6.7 kB 查看哈希

已上传 2 7