请考虑以下Python 3.x代码:
class FancyWriter:
def write(self, string):
print('<'+string+'>')
return len(string)+2
def testFancyWriter():
fw = FancyWriter()
print("Hello World!", file=fw)
print("How many new lines do you see here?", file=fw)
print("And here?", file=fw)
return
testFancyWriter()
输出如下所示:
<Hello World!>
<
>
<How many new lines do you see here?>
<
>
<And here?>
<
>
为什么中间有这些空白行?
好的 - 创建类似 FancyWriter 类的真正意图实际上是为 Excel 创建一个编写器类:我需要将选项卡式文本行写到 Excel 单元格中,将 Excel 行中的每一行以及每个制表符分隔的子字符串写入该行的单元格中。奇怪的是,在那个 ExcelWriter 类中(它还有一个像上面一样的 write() 函数,只是对 print() 的调用被替换为设置单元格值),发生了类似的现象 - 有空白行,就像上面的 FancyWriter 类的输出一样!(如果传入字符串的最后一个字符是"",我让目标单元格在下面移动一行。
有人能解释这一点吗?字面意义上的字里行间到底发生了什么?
对于带有写入函数的 FancyWriter(输出?文件?)类来说,"最 pythonic 的方式"是什么,以获得所需的输出,例如
<Hello World!>
<How many new lines do you see here?>
<And here?>
提前非常感谢!
你的"空行"实际上是用字符串'n'
调用你的函数来处理行尾。 例如,如果我们将打印更改为
print(repr(string))
并将hello world
行更改为
print("Hello World!", file=fw, end="zzz")
我们看到
'Hello World!'
'zzz'
'How many new lines do you see here?'
'n'
'And here?'
'n'
基本上,print
不会构建一个字符串,然后将end
值添加到其中,它只是end
传递给编写器本身。
如果你想避免这种情况,你必须避免print
,我认为,或者特例你的作者来处理接收某个(比如空)参数的情况,因为看起来print
即使它是空字符串也会传递end
。