python 3.6.1格式打印unicode
为什么在python 3.6.1中使用以下简单代码:python 3.6.1格式打印unicode,python,Python,为什么在python 3.6.1中使用以下简单代码: print(f'\xe4') 结果: Traceback (most recent call last): File "<pyshell#16>", line 1, in <module> print(f'\xe4') File "<pyshell#13>", line 1, in <lambda> print = lambda text, end='\n', file
print(f'\xe4')
结果:
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
print(f'\xe4')
File "<pyshell#13>", line 1, in <lambda>
print = lambda text, end='\n', file=sys.stdout: print(text, end=end, file=file)
File "<pyshell#13>", line 1, in <lambda>
print = lambda text, end='\n', file=sys.stdout: print(text, end=end, file=file)
File "<pyshell#13>", line 1, in <lambda>
print = lambda text, end='\n', file=sys.stdout: print(text, end=end, file=file)
[Previous line repeated 990 more times]
RecursionError: maximum recursion depth exceeded
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
打印(f'\xe4')
文件“”,第1行,在
print=lambda text,end='\n',file=sys.stdout:print(text,end=end,file=file)
文件“”,第1行,在
print=lambda text,end='\n',file=sys.stdout:print(text,end=end,file=file)
文件“”,第1行,在
print=lambda text,end='\n',file=sys.stdout:print(text,end=end,file=file)
[上一行重复了990次]
递归错误:超过最大递归深度
对我也适用。但也许它对你有用:
print(chr(0xe4))
让我们回顾一下:您已经用以下内容覆盖了内置的
print
函数:
print = lambda text, end='\n', file=sys.stdout: print(text, end=end, file=file)
这和
def print(text, end='\n', file=sys.stdout):
print(text, end=end, file=file)
正如您所看到的,这个函数递归地调用自己,但是没有递归基,当它完成时没有条件。最后是一个经典的无限递归示例
这绝对与Unicode或格式无关。不要以内置名称命名函数:
def my_print(text, end='\n', file=sys.stdout):
print(text, end=end, file=file)
my_print('abc') # works
或者至少保留对原件的参考:
print_ = print
def print(text, end='\n', file=sys.stdout):
print_(text, end=end, file=file)
print('abc') # works as well
注意:如果函数已被覆盖,则必须运行
del print
(或重新启动解释器)才能恢复原始内置项。可能是Python 3.6.1中的一个错误。在Python3.6.7中运行良好。如果您使用print=lambda text,end='\n',file=sys.stdout:print(text,end=end,file=file)
覆盖了内置打印,我一点也不奇怪。。。你用一个lambda阴影打印,然后在里面调用print,它调用print,它调用print。。。然后,请提供更多的上下文,以便问题可以重现。它很好地工作。。。OP创建了一个名为print
的新函数,该函数调用print
。。。因此递归。。。OPs的其他操作没有什么问题:)看起来OPs几乎是在尝试编写与my\u print=functools.partial(print,end=\n',file=sys.stdout)
或类似的程序。您不必重新启动解释器。。。您只需使用del print
删除lambda
'd版本,然后print
内置版本将弹出。。。例如<代码>打印=5<代码>打印。。。(整数5)del print
,print
:()@JonClements Partial有点不同,因为您失去了提供非默认参数的能力,尽管我不确定这在这种情况下是否非常有用。我将添加del
提示,谢谢。不确定您对partial的意思是什么?它只是修复了OP似乎正在做的一些参数,但除此之外,它的调用与原始的完全相同…是的。。。不是建议使用partial进行阴影打印-只是因为它更明显,更容易理解您正在做的事情(例如-修复参数)-当然不会将其绑定回打印以破坏以后的内容:)很好的解释:)