0

我试图记录我设置为在 Django 上运行的计划事件的完成情况。我正在尽我最大的努力使我的代码看起来像样,所以我没有将字符串放在一行中,而是使用多行字符串在命令管理类方法中输出到记录器。如代码所示的示例:

# the usual imports...
# ....
import textwrap

logger = logging.getLogger(__name__)

class Command(BaseCommand):
    def handle(self, *args, **kwargs):
        # some codes here
        # ....
        final_statement = f'''\
                           this is the final statements \
                           with multiline string to have \
                           a neater code.'''

        dedented_text = textwrap.dedent(final_statment)
        logger.info(dedent.replace('  ',''))

我尝试了一些我发现的方法,但是,大多数快速简便的方法仍然在终端上留下了很大的空间。如此处所示:

this is the final statement            with multiline string to have             a neater code.

所以我想出了一个创造性的解决方案来解决我的问题。通过使用。

dedent.replace('  ','')

确保将两个空格替换为没有空格,以免消除单词之间的正常空格。最终产生了:

this is the final statement with multiline string to have a neater code.

这是一个优雅的解决方案还是我错过了互联网上的一些东西?

4

3 回答 3

0

感谢 Neil 的建议,我提出了一个更优雅的解决方案。通过创建一个函数来用 none 替换两个空格。

def single_line(string):
    return string.replace('  ','')

final_statement = '''\
    this is a much neater
    final statement
    to present my code
    '''

print(single_line(final_statement)

正如 Neil 的解决方案即兴创作的那样,我减少了正则表达式的导入。那是少了一行代码!

此外,将其作为一个函数提高了可读性,因为整个打印语句就像英语一样读起来。“打印单行最终语句”

有更好的主意吗?

于 2018-07-12T16:04:30.587 回答
0

Neil 和 Wong Siwei 的答案的问题是,如果您的多行字符串包含的行比其他行缩进更多,它们就不起作用:

my_string = """\
   this is my
   string and
          it has various
   identation
   levels"""

在上述情况下,您想要的是删除两个空格的缩进,而不是行首的每个空格。

下面的解决方案应该适用于所有情况:

import re

def dedent(s):
    indent_level = None

    for m in re.finditer(r"^ +", s):
        line_indent_level = len(m.group())
        if indent_level is None or indent_level > line_indent_level:
            indent_level = line_indent_level

    if not indent_level:
        return s

    return re.sub(r"(?:^|\n) {%s}" % indent_level, "", s)

它首先扫描整个字符串以找到最低缩进级别,然后使用该信息对它的所有行进行缩进。


如果您只关心使您的代码更易于阅读,则可以改为使用类似 C 的字符串“连接”:

my_string = (
  "this is my string"
  " and I write it on"
  " multiple lines"
)

print(repr(my_string))
# => "this is my string and I write it on multiple lines"

您可能还想用+s 明确表示:

my_string = "this is my string" + \
            " and I write it on" + \
            " multiple lines"
于 2018-07-12T16:28:40.727 回答
0

您可以使用正则表达式简单地删除换行符后的所有空格。此外,将它包装到一个函数中可以减少重复的代码,所以让我们这样做。

import re
def single_line(string):
    return re.sub("\n\s+", "", string)

final_statement = single_line(f'''
                   this is the final statements 
                   with multiline string to have 
                   a neater code.''')
print(final_statement)

或者,如果您希望避免这个特定问题(并且不挖掘开发开销),您可以将它们存储在一个文件中,例如 JSON,这样您就可以快速编辑提示,同时保持代码干净。

于 2018-07-12T15:24:36.037 回答