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 %}