Python / print()
===
###### tags: `Python`
###### tags: `Python`, `print()`, `string`, `format`, `str.format`, `f-string`, `r-string`, `!r`, `!s`, `!a`
<br>
[TOC]
<br>
## 討論
### `!r` 是什麼意思?
- ### gpt-5 (2025/08/19)
`!r` 是 Python f-string / `str.format` 的**轉換旗標**,表示「先對值套用 `repr()` 再格式化」。
換句話說,`{x!r}` 等同於 `repr(x)` 的輸出(包含引號、跳脫字元等,方便除錯)。
### 常見三種轉換
* `!r` → `repr(x)`(偏給開發者看的「可再建構」描述)
* `!s` → `str(x)`(給使用者看的字串)
* `!a` → `ascii(x)`(非 ASCII 會跳脫)
### 範例
```python
x = "hi\n"
print(f"{x}") # 直接印字串:會換行
# 輸出:
# hi
# (下一行)
print(f"{x!r}") # repr:顯示跳脫字元並加引號
# 輸出:
# 'hi\n'
```
自訂型別的差異(`__str__` vs `__repr__`):
```python
class User:
def __init__(self, name): self.name = name
def __str__(self): return f"User: {self.name}" # 給使用者看
def __repr__(self): return f"User(name={self.name!r})" # 給開發者看
u = User("Alice")
print(f"{u}") # User: Alice
print(f"{u!r}") # User(name='Alice')
```
可與格式規則一起用(先轉換,再套格式):
```python
x = "A\nB"
print(f"[{x!r:>20}]") # 先變成 'A\nB',再做右對齊寬度 20
```
### 與 logging 的 `%r`
在 `logging` 的舊式格式化裡:
```python
import logging
logging.warning("Bad input: %r", x)
```
`%r` 的效果就像 f-string 的 `!r`:會使用 `repr(x)`,很適合**除錯與記錄**,因為能看見隱藏字元與引號。
**總結**:`!r` = 用 `repr()` 顯示「原汁原味、可判讀」的物件表示,除錯時特別好用。
<br>
{%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}