91484


Pythonのシングルクォーテーションと組み込み関数のstr()の違いについて知りたいです．

[code]

    s1 = '{"input":{"action":"read","role":"User","request":["gender","address","birthDate","familyName","telephone"]}}'
    
    s2 = str({"input":{"action":"read","role":"User","request":["gender","address","birthDate","familyName","telephone"]}})
    
    s1 == s2
    ->False
    
[/code]

となるのですが，なぜそうなるのでしょうか？


CC BY-SA 4.0
2022-10-07T06:48:57.177
91481
2022-10-07T11:23:00.797
41070
question
python string
Pythonのシングルクォーテーションと組み込み関数str()の違い


s2は，辞書の文字列表現です．

> If neither encoding nor errors is given, str(object) returns type(object).
> **str** (object), which is the "informal" or nicely printable string
> representation of object.

【引用】[組み込み型 ---
Python3ドキュメント](https://docs.python.org/ja/3/library/stdtypes.html?highlight=dict#string-
methods:%7E:text=If%20neither%20encoding,repr\(object\).)

そのため，辞書の中身が少し **整形** されて出力されます．

恐らく期待する入出力はこちらです．

[code]

    >>> s1 = "{'input': {'action': 'read', 'role': 'User', 'request': ['gender', 'address', 'birthDate', 'familyName', 'telephone']}}"
    >>> s2 = str({"input":{"action":"read","role":"User","request":["gender","address","birthDate","familyName","telephone"]}})
    >>> s1 == s2
    True
    
[/code]


CC BY-SA 4.0
2022-10-07T07:25:40.070
91483
2022-10-07T11:23:00.797
2022-10-07T11:23:00.797
3060
51374
91481
answer


前者(`s1`)は前後をシングルクォーテーションでくくることで、中身がどのようなものであろうと単純に文字列を宣言しています。  
後者(`s2`)は一旦[`dict`](https://docs.python.org/ja/3/library/stdtypes.html#dict)オブジェクトを作り、それを[`str`](https://docs.python.org/ja/3/library/stdtypes.html#str)関数で文字列化しています。

後者の処理では`dict`から`str`への型変換が発生するため、型変換時に整形処理が入るので`s1`と`s2`が同一の文字列ではなくなります。

下記のコードを実行してみてください。

[code]

    s1 = '{"input":{"action":"read","role":"User","request":["gender","address","birthDate","familyName","telephone"]}}'
    s2 = str({"input":{"action":"read","role":"User","request":["gender","address","birthDate","familyName","telephone"]}})
    
    print(s1 == s2) # False
    
    print(s1) # {"input":{"action":"read","role":"User","request":["gender","address","birthDate","familyName","telephone"]}}
    print(s2) # {'input': {'action': 'read', 'role': 'User', 'request': ['gender', 'address', 'birthDate', 'familyName', 'telephone']}}
    
    print(s1 == s2.replace(" ", "").replace("'", '"')) # True
    
[/code]

実行結果を見ると、整形有無で文字列が変わっていることが分かります。

[code]

    False
    {"input":{"action":"read","role":"User","request":["gender","address","birthDate","familyName","telephone"]}}
    {'input': {'action': 'read', 'role': 'User', 'request': ['gender', 'address', 'birthDate', 'familyName', 'telephone']}}
    True
    
[/code]

なお、なぜ整形時にくくり文字がシングルクォーテーションに変わって出力されるのかについては、公式資料の[3.1.2. 文字列型
(string)](https://docs.python.org/ja/3/tutorial/introduction.html#strings)から仕様が読み取れます。

> 対話的インタプリタが文字列を出力するとき、出力文字列は引用符に囲まれ、特殊文字はバックスラッシュでエスケープされます。出力文字が入力とは違って見える
> (囲っている引用符が変わる) こともありますが、その 2
> つの文字列は同じ文字列です。文字列が単引用符を含み二重引用符を含まない場合、二重引用符で囲われ、それ以外の場合は単引用符で囲われます。

**参考資料**

  * [**str** and single vs double quote behavior in Python](https://stackoverflow.com/q/9830522)


CC BY-SA 4.0
2022-10-07T07:25:41.850
91484
2022-10-07T07:25:41.850
9820
91481
answer