Напишите читаемый тестовый пример для сравнения, который включает "\ n" - PullRequest
6 голосов
/ 12 июля 2020

У меня есть строка result, которая выглядит так:

>>> result
'--- \n+++ \n@@ -48,7 +48,7 @@\n     "%%time\\n",\n     "def hello(name: str = \\"world\\"):\\n",\n     "\\n",\n-    "    return f\'hello {name}\'\\n",\n+    "    return f\\"hello {name}\\"\\n",\n     "\\n",\n     "\\n",\n     "hello(3)"\n'
>>> print(result)
--- 
+++ 
@@ -48,7 +48,7 @@
     "%%time\n",
     "def hello(name: str = \"world\"):\n",
     "\n",
-    "    return f'hello {name}'\n",
+    "    return f\"hello {name}\"\n",
     "\n",
     "\n",
     "hello(3)"

Я хотел бы написать для этого тестовый пример. Один (не такой простой для чтения) способ записать это будет

expected = '--- \n+++ \n@@ -48,7 +48,7 @@\n     "%%time\\n",\n     "def hello(name: str = \\"world\\"):\\n",\n     "\\n",\n-    "    return f\'hello {name}\'\\n",\n+    "    return f\\"hello {name}\\"\\n",\n     "\\n",\n     "\\n",\n     "hello(3)"\n'

, а затем

assert result == expected

будет работать.

Еще один более читаемый способ -

    expected = (
        """
        --- 
        +++ 
        @@ -48,7 +48,7 @@
            "%%time\n",
            "def hello(name: str = \"world\"):\n",
            "\n",
        -    "    return f'hello {name}'\n",
        +    "    return f\"hello {name}\"\n",
            "\n",
            "\n",
            "hello(3)"

        """
    )

но тогда

assert result == expected

больше не работает.

Я думаю, что \n внутри строк затрудняет выполнение чего-то вроде

'\n'.join([i[8:] for i in expected.split('\n')])
  • не говоря уже о том, что это нелегко читать.

Есть ли способ записать expected с тройными кавычками (как указано выше) таким образом, чтобы result==expected подойдет?

1 Ответ

4 голосов
/ 15 июля 2020

Вы можете использовать textwrap.dedent для поиска и удаления общих начальных пробелов, что полезно для получения правильного отступа для строк, заключенных в тройные кавычки. Обратите внимание, что я также использую str.lstrip для удаления начальной новой строки, что IMO упрощает чтение строки, вместо того, чтобы помещать начальную тройную кавычку в той же строке, что и ---. Наконец, чтобы избежать экранирования \, можно использовать строку r aw.

import textwrap

result = '--- \n+++ \n@@ -48,7 +48,7 @@\n     "%%time\\n",\n     "def hello(name: str = \\"world\\"):\\n",\n     "\\n",\n-    "    return f\'hello {name}\'\\n",\n+    "    return f\\"hello {name}\\"\\n",\n     "\\n",\n     "\\n",\n     "hello(3)"\n'

expected = textwrap.dedent(
    r"""
    --- 
    +++ 
    @@ -48,7 +48,7 @@
         "%%time\n",
         "def hello(name: str = \"world\"):\n",
         "\n",
    -    "    return f'hello {name}'\n",
    +    "    return f\"hello {name}\"\n",
         "\n",
         "\n",
         "hello(3)"
    """
).lstrip()

assert expected == result
...