【问题标题】:Python naming conventions for modules in subpackages子包中模块的 Python 命名约定
【发布时间】:2020-02-04 12:46:47
【问题描述】:

我正在创建一个 python 包,将由大约 1 个小型最终用户组使用。 20人。一个更小的 3 人开发团队将为该软件包做出贡献。

我的包包含多个子包。我不希望最终用户访问子包中的任何实用程序功能。如何命名这些子包中的子包和模块?

  • 子包中的模块名称以下划线开头?例如_mymodule.py
  • 子包名称以下划线开头?例如_mypackage
  • 两者都有?

我的目的是与最终用户沟通,这些子包不是为他们设计的。但是,这些函数可能需要作为其他子包中的实用函数,因此并不是真正的“私有”。

【问题讨论】:

  • 我不完全相信这是必要的。仅仅将内容隐藏在子包中通常就足以让普通用户隐藏它。
  • ????同意。在顶层模块中提供用户应该与之交互的功能,并对其进行广泛的记录,以便清楚用户应该如何使用该模块。任何未记录且不明显直接有用的内容通常被理解为内部实现细节。
  • 如果用户想要使用未记录的功能,他们无论如何都可以这样做,因为 python 的动态特性。没有真正私有的“事物”,所以只需使用常用的方式(pep8) - 用一个下划线命名以表示该事物不是公共的。如果您想将事物标记为受保护,则示例中的两个选项都可以接受
  • 感谢您的回答。但是,由于方法繁多,将所有内容都放在顶层模块中是不切实际的。我同意您对功能有限的小型软件包的建议。
  • 经过进一步研究,我从 pandas github 存储库中获得了灵感。 (例如 io 子包)该方法难以概括,并且看起来像是个案决定。但结果感觉不错:github.com/pandas-dev/pandas/tree/master/pandas/io

标签: python coding-style pep8


【解决方案1】:

类中的方法应该用前缀__(双下划线)声明。当方法以 __ 为前缀时,它们被认为是私有的。请检查以下代码,

类基:

# Declaring public method 
def fun(self): 
    print("Public method") 

# Declaring private method 
def __fun(self): 
    print("Private method") 

在这个类中,方法__fun不能被下面的对象访问, obj1 = Base() obj1.__fun()

obj1.__fun() 行会引发 AttributeError。

【讨论】:

  • OP 询问的是模块命名,而不是方法。
  • ..它并不是真正的“私人”。您仍然可以以obj1._Base__fun() 的身份访问该方法。
  • Python 没有像其他语言那样的隐私模型,只有命名约定和class name mangling。它们的用途是避免与子类的名称冲突,而不是封装。最重要的是,这只适用于类定义中的名称,不适用于模块名称,这正是问题所在。
猜你喜欢
  • 1970-01-01
  • 2019-01-14
  • 2012-07-20
  • 2011-09-13
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多