【问题标题】:python displays `\n` instead of breaking a linepython 显示 `\n` 而不是换行
【发布时间】:2019-08-10 02:29:22
【问题描述】:

我编写了一个函数来创建 SQL 查询的 VALUES 部分:

def query_values(data_iterator):
    return ',\n'.join('\n({})\n'.format(',\n'.join('"{}"'.format(value) for value in data_row)
                                     ) for data_row in data_iterator
                      ),

当我调用这个函数并print 得到结果时,我得到的是:

query_values:
('\n("801",\n"printer",\n"barcode printer")\n,\n\n("844",\n"laptop",\n"windows")\n,\n\n("997",\n"printer",\n"barcode printer")\n',)

全部在一条线上。不会换行,而是显示\n

最初我有一个\n,但后来我插入了多个,只是为了看看它们是否会显示出来。

第二个问题是整个东西都有括号,这是我不想要的。

我对这两个问题感到困惑,我想出了第二个问题的解决方案:

函数末尾有一个逗号。逗号导致函数返回一个元组,而不是单个字符串。

我删除了逗号:

def query_values(data_iterator):
    return ',\n'.join('\n({})\n'.format(',\n'.join('"{}"'.format(value) for value in data_row)
                                     ) for data_row in data_iterator
                      )

这解决了两个问题。现在的输出是:

query_values:

("801",
"printer",
"barcode printer")
,

("844",
"laptop",
"windows")
,

("997",
"printer",
"barcode printer")

我把逗号放回去了,\n 就显示出来了。我去掉了逗号,又多了几行。

我已经删除了无关的\n,所以现在我得到了我想要的:

query_values:

("801","printer","barcode printer"),
("844","laptop","windows"),
("997","printer","barcode printer")

所以,我的代码可以正常工作,但我对旧版本代码中显示的 \n 字符完全感到困惑。为什么会这样?

更新: 这个问题的几个答案集中在为什么我得到一个元组。那不是我的问题。为什么会显示/n

【问题讨论】:

    标签: python string tuples newline repr


    【解决方案1】:

    这似乎是元组的行为。当打印一个元组时, print 在每个元素上调用__repr()__。列表也是如此。

    我试过了:

    tup = "xxx\nxx",
    lst =["xxx\nxx"]
    for t in tup,lst:
        print('t      :', t)
        for s in t:
            print('element:',s)
            print('   repr:',s.__repr__())
        print('---')
    

    输出是:

    t      : ('xxx\nxx',)
    element: xxx
    xx
       repr: 'xxx\nxx'
    ---
    t      : ['xxx\nxx']
    element: xxx
    xx
       repr: 'xxx\nxx'
    ---
    

    因此,元组和列表的行为相同。

    当我们有一个字符串时,调用__repr__() 不会扩展\n 字符,而是在它周围加上引号:

    s = "xxx\nxx"
    print('s           :', s)
    print('s.__repr__():', s.__repr__())
    

    输出:

    s           : xxx
    xx
    s.__repr__(): 'xxx\nxx'
    

    running.tinterjayDaniel Roseman 在 cmets 中提到了这种元组行为,但在答案中没有提到,这就是我发布这个答案的原因。

    【讨论】:

    • 你是说元组没有定义__str__ 吗?对于元组t,我尝试了t.__str__(),得到的结果与t.__repr__() 相同。我不知道如何检查__str__()是否未定义,或者定义为与__repr__相同
    • It is marked as undefined in the C code. 不过,我不认为区别是外部可见的。
    • @SolomonUcko 对于 C 类型 没有明显区别,因为您实际上无法在类型的 struct 中查找真正的属性。对于 Python 类型,存在明显的差异。
    • @wizzwizz4 是的。至少在 CPython 中,C 类型的魔法方法显示为 slot wrappers。
    【解决方案2】:

    元组可以用括号表示,也可以不用括号,逗号决定类型。

    >>> t = 1, 'a', 'abc'
    >>> type(t)
    <type 'tuple'>
    >>> t
    (1, 'a', 'abc')
    >>> 
    

    在上面的例子中,你在字符串后面添加了一个逗号,python 将它解释为一个元组。

    检查这个link

    >>> t= 'a',
    >>> type(t)
    <type 'tuple'>
    >>> t
    ('a',)
    >>> t = 'a'
    >>> type(t)
    <type 'str'>
    >>> t
    'a'
    

    【讨论】:

    • 我知道我为什么要得到一个元组。我的问题是为什么会显示\n
    • 因为打印一个元组在其元素上调用repr
    【解决方案3】:

    这似乎是 Python 中元组的行为。 您可以使用更简单的情况进行测试,如下所示:

    >>> print ("xxx\n\nx",)
    ('xxx\n\nx',)
    

    似乎 Python 可以帮助您调试并在打印时转义字符串中的所有命令序列,以便字符串以与定义相同的方式出现。

    它确实让你感到困惑,有趣的案例。 :)

    【讨论】:

      【解决方案4】:

      return something,return (something,) 相同:它返回一个包含一个元素的元组。当您print this 时,它将显示元组的外圆括号,其中的字符串将作为其源代码表示形式打印,即带有转义码和内引号。

      但是,return something 只是返回该值,然后可以正常打印。

      【讨论】:

      • 我知道我为什么要得到一个元组。我的问题是为什么会显示\n
      • @GrannyAching:您可以在这里找到问题的答案。 \n 显示,因为您打印字符串的元组而不是单个字符串,并且在打印元组的情况下,这是默认行为。
      • @GrannyAching 在里面的元素上打印一个元组调用reprrepr 给出了对象的表示,通常类似于它在源代码中的显示方式,因此字符串将包含引号和转义码。
      猜你喜欢
      • 2020-05-11
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多