了解类对象的entry_points行为

时间:2018-07-27 22:15:19

标签: python setuptools setup.py

我正在从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>

从输出中,我可以说出几件事:

  1. 我的脚本运行正确。...之类的。
    • 通过__init__传递sys.argv并根据其大小运行正确的类方法,显然可以正确初始化。
  2. 我的脚本正在为对象实例返回一个不需要的内存值。

我的假设是,通过使类本身成为入口点,运行脚本可创建类对象的实例,以便正确评估。反过来,这会导致创建类对象,__init__()会作为脚本执行过程中创建类对象的意外但期望的副作用而运行。最后,返回Loxy类的内存地址,这与分配类而不是创建一个类的实例这一常见错误类似,例如:

>>> foo = Foo # incorrect
>>> foo
<Foo object at 0x5678656>
>>> foo = Foo() # correct

我的分析正确吗?

最后,当使用__init__()进行打包时,有没有办法像脚本entry_points一样正确调用诸如setup.py之类的类方法?

0 个答案:

没有答案