我正在从Crafting Interpreters创建一个Lox的python端口。作为该端口的一部分,我认为我将使该项目具有合适的setup.py
以便上传到pypi并通过pip用作终端工具。
使该项目与众不同的是,我将脚本入口点设置为类本身,所以我得到了一些有趣的行为,我想理解,为什么它正在发生,以及如何做得更正确!
我的项目布局如下:
├── loxy
│ ├── __init__.py
│ └── loxy.py
└── setup.py
在我的setup.py中,entry_points
条目中包含以下内容:
"console_scripts": ['loxy = loxy.loxy:Loxy]
在loxy.py
内,您将找到以下内容:
class Loxy():
"""
the main loxy class.
this acts as the driver for the loxy interpreter.
"""
def __init__(self):
"docstring"
if len(sys.argv) > 2:
print("Usage: loxy [script]")
sys.exit()
elif len(sys.argv) == 2:
self.run_file(sys.argv[1])
else:
self.run_prompt()
def run_file(self, f):
print("run_file()")
def run_prompt(self):
print("run_prompt()")
print("foo")
当我使用pip在本地安装软件包并在没有参数的终端loxy
中运行时,得到以下输出:
run_prompt()
foo
<loxy.loxy.Loxy object at 0x7f305301f978>
从输出中,我可以说出几件事:
__init__
传递sys.argv
并根据其大小运行正确的类方法,显然可以正确初始化。我的假设是,通过使类本身成为入口点,运行脚本可创建类对象的实例,以便正确评估。反过来,这会导致创建类对象,__init__()
会作为脚本执行过程中创建类对象的意外但期望的副作用而运行。最后,返回Loxy
类的内存地址,这与分配类而不是创建一个类的实例这一常见错误类似,例如:
>>> foo = Foo # incorrect
>>> foo
<Foo object at 0x5678656>
>>> foo = Foo() # correct
我的分析正确吗?
最后,当使用__init__()
进行打包时,有没有办法像脚本entry_points
一样正确调用诸如setup.py
之类的类方法?