Skip to main content
 首页 » 编程设计

python之将复活节彩蛋分配给变量

2025年05月04日12java哥

是否可以分配 Python 复活节彩蛋 this到一个变量?

理想情况下,我想做的是在文本上尝试各种字符串方法,比如“the”这个词出现了多少次。

我尝试了以下方法:

import this 
 
long_text = this 
 
print long_text.count('the') 

这会打印出 Zen 消息,但我在使用计数方法时看到错误:

...     
Namespaces are one honking great idea -- let's do more of those! 
Traceback (most recent call last): 
  File "count.py", line 5, in <module> 
    print long_text.count('the') 
AttributeError: 'module' object has no attribute 'count' 

提前致谢。

请您参考如下方法:

this 模块中的代码是故意混淆的代码,作为一个玩笑,*因此字符串不会直接出现在任何地方。

但是,如果您查看源代码(例如 print inspect.getsource(this),或查看 in the source repo ),您会看到最后一行是:

print "".join([d.get(c, c) for c in s]) 

...这意味着答案是:

text = "".join([this.d.get(c, c) for c in this.s]) 

当然,这依赖于未记录的、特定于实现的细节,但是 this 模块本身是未记录的、特定于实现的细节,可以通过查看 the library reference 看出。 .


但是,如果您想要的东西可以与具有 this 模块的任何 Python 实现一起使用,即使它的实现方式不同(这不是一个存在的单一 Python 实现,到目前为止)据我所知......),你总是可以这样做:

old_stdout = sys.stdout 
sys.stdout = StringIO.StringIO() 
try: 
    import this 
    text = sys.stdout.getvalue() 
finally: 
    sys.stdout = old_stdout 

但是,请记住 import 仅在第一次导入时运行代码,因此如果您在同一 session 中执行两次,您将以 '' 第二次。


另一个有趣的选择是下载 PEP 20并使用您最喜欢的 HTML 解析器解析它以提取文本。但我会将其保留为 e读者练习。


* 如果你想知道,这个笑话是混淆源代码,从头开始重新实现 rot13,即使它内置在 stdlib 中,用嵌套循环来做,循环 65 到 97 而不是字符,循环遍历 range(26) 因为你必须多次阅读代码才能理解......所有这些都尽可能严重地违反了 Zen。参见 Barry Warsaw's post了解他们在实现时的心态的更多背景。