Python 3.6的一个功能是格式化字符串.
这个SO问题(python-3.6中带有'f'前缀的字符串)询问格式化字符串文字的内部,但我不理解格式化字符串文字的确切用例.我应该在哪些情况下使用此功能?不明确比隐含更好吗?
我正在使用 f-strings,我需要定义一个依赖于变量的格式。
def display_pattern(n):
temp = ''
for i in range(1, n + 1):
temp = f'{i:>3}' + temp
print(temp)
Run Code Online (Sandbox Code Playgroud)
如果相关,则输出display_pattern(5)为:
1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以操作 format >3,并传递一个变量。例如,我尝试了以下方法:
def display_pattern(n):
spacing = 4
format_string = f'>{spacing}' # this is '>4'
temp = ''
for i in range(1, n + 1):
temp = f'{i:format_string}' + temp
print(temp)
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
Traceback (most recent call last):
File "pyramid.py", line 15, …Run Code Online (Sandbox Code Playgroud) 在python文档2.4.3中。格式化的字符串文字,似乎可以在f字符串中写一个星号后跟一个表达式{},但是我找不到如何使用它。
那是什么以及我如何使用它?是否记录在某处?
确切地说,这是关于"*" or_expr以下BNF的一部分。
f_string ::= (literal_char | "{{" | "}}" | replacement_field)*
replacement_field ::= "{" f_expression ["!" conversion] [":" format_spec] "}"
f_expression ::= (conditional_expression | "*" or_expr)
("," conditional_expression | "," "*" or_expr)* [","]
| yield_expression
Run Code Online (Sandbox Code Playgroud)
我在REPL中尝试过,但是会导致错误。
f_string ::= (literal_char | "{{" | "}}" | replacement_field)*
replacement_field ::= "{" f_expression ["!" conversion] [":" format_spec] "}"
f_expression ::= (conditional_expression | "*" or_expr)
("," conditional_expression | "," "*" or_expr)* [","]
| yield_expression
Run Code Online (Sandbox Code Playgroud) 在 Python (3.11) 中,为什么在 f 字符串内使用赋值表达式(“海象运算符”)时需要用括号括起来?
例如:
#!/usr/bin/env python
from pathlib import Path
import torch
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
ckpt_dir = Path("/home/path/to/checkpoints")
_ckpt = next(ckpt_dir.iterdir())
print(_ckpt)
sdict = torch.load(_ckpt, map_location=DEVICE)
model_dict = sdict["state_dict"]
for k, v in model_dict.items():
print(k)
print(type(v))
print(_shape := v.size())
print(f"{(_numel := v.numel())}")
print(_numel == torch.prod(torch.tensor(_shape)))
Run Code Online (Sandbox Code Playgroud)
上面的代码块 withprint(f"{_numel := v.numel()}")相反不会解析。
解析/AST 创建是否要求这样做?
为什么不能在f字符串中使用"await"?有没有办法强制f字符串在协程函数的上下文中评估格式表达式?
$ python3
Python 3.6.0 (default, Mar 4 2017, 12:32:37)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> async def a(): return 1
...
>>> async def b(): return 'The return value of await a() is {}.'.format(await a())
...
>>> async def c(): return f'The return value of await a() is {await a()}'
...
File "<fstring>", line 1
(await a())
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud) 这f-string是Python 3.6中的新功能之一.
但是,当我尝试这个:
>>> f"\{10}"
'\\{10'
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么左大括号'{'保留在结果中.我认为结果应该与str.format:
>>> "\{}".format(10)
'\\10'
Run Code Online (Sandbox Code Playgroud)
在PEP-0498中,它没有明确回答这个问题.那么是什么原因导致左大括号'{'留在结果和是什么原因导致之间的差异f-string和str.format()?
我一直在使用新的f-string格式检查我的一些字符串格式选项.我经常需要解压缩列表和其他未知长度的迭代.目前我使用以下...
>>> a = [1, 'a', 3, 'b']
>>> ("unpack a list: " + " {} "*len(a)).format(*a)
'unpack a list: 1 a 3 b '
Run Code Online (Sandbox Code Playgroud)
这虽然有点麻烦,但使用3.6之前的格式表示法.考虑到运行时字符串连接,新的f-string格式选项很有意思.这是我遇到问题的{}数量的复制.在我之前的例子中,我只是创建了必要的结构并在.format()部分中解压缩.
尝试这样做产生了一个有效的变体,但是,我不能将两个花括号放在一起,或者它不能解包...
(1)
>>> 'unpack a list' f' {{*a}}'
'unpack a list {*a}'
Run Code Online (Sandbox Code Playgroud)
按下,我在内部{}对周围插入了一个空格.这是一个适度的改进,但是开始和结束{,}存在.
(2)
>>> 'unpack a list' f' { {*a} }'
"unpack a list {1, 3, 'a', 'b'}"
Run Code Online (Sandbox Code Playgroud)
将变体拼接成一个封闭的f-string使外观和语法更好,因为评估显然是从左到右.然而,这仍然留下了封闭的花括号.
(3)
>>> f'unpack a list { {*a} }'
"unpack a list {1, 3, 'a', 'b'}"
Run Code Online (Sandbox Code Playgroud)
也许,我正在过度思考整个过程,并希望采用某种形式的自动拆包.这只是产生了列表表示,大括号被[]替换.
(4)
>>> f'unpack a list {a}'
"unpack a …Run Code Online (Sandbox Code Playgroud) 在Python 3.6中,您可以使用以下f字符串:
>>> date = datetime.date(1991, 10, 12)
>>> f'{date} was on a {date:%A}'
'1991-10-12 was on a Saturday'
Run Code Online (Sandbox Code Playgroud)
我想重载接收'%A'上述方法的方法.可以吗?
例如,如果我想写一个愚蠢的包装器datetime,我可能期望这个重载看起来像:
class MyDatetime:
def __init__(self, my_datetime, some_other_value):
self.dt = my_datetime
self.some_other_value = some_other_value
def __fstr__(self, format_str):
return (
self.dt.strftime(format_str) +
'some other string' +
str(self.some_other_value
)
Run Code Online (Sandbox Code Playgroud) 我得到了一个line too longpep8 E501问题.
f'Leave Request created successfully. Approvers sent the request for approval: {leave_approver_list}'
Run Code Online (Sandbox Code Playgroud)
我尝试使用多行字符串,但这带来了一个\n,这打破了我的测试:
f'''Leave Request created successfully.
Approvers sent the request for approval: {leave_approver_list}'''
Run Code Online (Sandbox Code Playgroud)
如何保持单线并通过pep8linting
关于 python f 字符串的基本问题,但找不到答案:如何强制浮点数或整数的符号显示?即什么 f 字符串使3显示为+3?