---
# System prepended metadata

title: Python / print()
tags: ['!a', string, format, '!s', print(), str.format, Python, r-string, f-string, '!r']

---

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