【问题标题】:Can a Python package name start with a number?Python 包名可以以数字开头吗?
【发布时间】:2013-07-05 10:54:59
【问题描述】:

我知道以数字开头的 Python 模块命名是一个坏主意,正如 this other question 中所述,但我想知道在 Python 包中这样做是否合法,而不是在模块(又名文件)中这样做。

例如。我想将一个 Django 网站与一些外部 API 集成,我想创建一个“第三方”包,其中包含每个提供程序的文件,我不知道调用它 3rd_party 是否会让人头疼或者我应该命名改为third_party,以避免出现问题。

注意:我不知道这是否重要,但我使用的是 Python 2.7

【问题讨论】:

    标签: python


    【解决方案1】:

    不,它不能。 Python 包和模块名称需要为valid identifiers:

    identifier ::=  (letter|"_") (letter | digit | "_")*
    

    标识符必须以字母或下划线开头。

    import statement 将模块的语法定义为:

    module          ::=  (identifier ".")* identifier
    

    包是一种特殊类型的模块(实现为带有__init__.py 文件的目录)并且不能免除这些规则。

    技术上您可以通过不使用import 语句来解决此问题,因为importlib 模块和__import__ 挂钩不强制执行限制。然而,给你的包或模块命名并不是一个好主意,这样你就需要使用非标准的导入机制来使其工作。

    【讨论】:

    • 我问的是包,不是模块。
    • 包是作为目录实现的专用模块,因此规则仍然适用。
    • 好的,所以包和模块不能以数字开头。所以,我会选择third_party。谢谢! :)
    • 我完全同意你的观点,使用“黑客”不是要走的路!
    • @SahithVibudhi 对。破折号不在列表中。字母、下划线,如果不是第一个字符,则只有数字。
    【解决方案2】:

    是的。

    # 1/x.py dont forget 1/__init__.py
    x = 42
    

    从另一个文件导入

    # test.py
    p1 = __import__('1.x')
    print p1.x.x
    

    【讨论】:

    • 在您的示例中,1.py 是 Python 模块,而不是包。
    • 要求变通方法并不能使模块对其他人有用。
    • 我同意@MartijnPieters,我会接受他的回答,因为它完美地解释了案件并解决了我的疑问。谢谢!
    • @Caumons 对不起。类似的方法适用于包。我也同意 MartijnPieters。这只是一个玩具,不应出现在任何产品中。
    猜你喜欢
    • 2012-05-28
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2016-02-25
    • 2011-06-29
    • 2019-04-20
    • 2021-08-01
    相关资源
    最近更新 更多