是否可以分配 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了解他们在实现时的心态的更多背景。
