【问题标题】:Python organising small project/scriptPython 组织小项目/脚本
【发布时间】:2013-05-27 19:26:02
【问题描述】:

我对 python 很陌生,对一些事情不确定。

  1. 类应该在单独的文件中吗?
  2. 独立脚本是否有 main 方法?如果是这样,这是如何工作的,因为我有一个没有被调用的主要方法
  3. 单元测试目录通常放在哪里,它如何“包含”它正在测试的文件?

【问题讨论】:

  • 数字 1 是个人喜好,与我认为需要它的 Java 不同,在 python 中它不是。但据我所见,大多数人将他们所有的类都放在一个文件中,只是为了简化导入。我宁愿导入一件事并拥有import theClasses 而不是import class1,class2,class3
  • 2 号是你想要的。通常人们会将if __name__ == "__main__": go() (或任何他们的主要功能)放在他们的python文件的末尾,这将导致它在双击或从命令提示符加载后立即运行go()

标签: python


【解决方案1】:

这里有很多内容需要讨论,将这些要点分解为单独的问题/查询可能会更好地为您服务:)

  1. 我会拒绝不必要地将类拆分为单独的文件。有些类可能严重依赖于其他类,我(个人)喜欢将它们放在同一个文件中。我觉得最好的约定是根据功能创建文件,而不是为每个类创建一个单独的文件。

    我从 Pocoo 项目(如 Flask 和 Jinja2)中获得了很多灵感。 Jinja2 源代码提供了一个在文件中“捆绑”某些相关类的绝佳示例:Github

  2. 独立脚本通常使用 if __name__ == '__main__' 之类的东西来检查是否直接执行(例如 python scriptname.py),然后通常执行一个函数 main()(感谢 Mike 纠正我的错误)。

    为了更好地帮助解决您的main 未被调用的问题,我建议您显示您尝试使用的代码。

  3. 有许多不同的方法可以做到这一点,但约定似乎是在项目内的teststesttestsuite 目录中。这个问题的后半部分变得非常棘手,因为 Python 导入取决于您的 Python 项目的结构/类型(它是 Python 包吗?一个独立的脚本集合?)和您的 PYTHONPATH

    This SO 帖子是一个很好的起点,可以考虑将测试放在哪里,尽管一般的答案似乎是“哪里最适合你/你的团队”:)。

    在一个稍微相关的说明中,我还建议研究 Nose 测试框架,因为它消除了使用 Python 进行测试的大量样板。

【讨论】:

  • 这不是__main__ 方法。成语是if __name__ == '__main__' 然后调用我的函数,通常称为main()
  • @MikeMüller 感谢迈克的更正,我已将其纳入我的答案中。
【解决方案2】:
  1. 不必,但如果该类被其他几个文件/类使用,则应该这样做。
  2. 这是一个很好的做法,请参阅What does <if __name__==“__main__”:> do?
  3. Python 会查看 $PYTHONPATH,它是用于查找模块的目录列表。您可以将模块放在这些目录之一的子目录中,并使用 import directoryname.module. 导入它们。您可以通过from directoryname.module import ClassName 导入课程。

【讨论】:

    【解决方案3】:

    我会回答问题 1 和 2。

    1) 这取决于。如果您的课程很小,则可以将它们放在同一个文件中。如果它们变大,它们通常会保存在单独的文件中。
    2)不,不需要有一个主要的方法。但是,对于脚本来说,这是一个非常常见的成语:

    def main():
        # Your code
    
    # At the bottom of the file
    if __name__ == '__main__':
        main()
    

    这样,您的main 只会在文件作为脚本运行时运行,但在作为模块导入时不会运行。当您导入模块时,Python 只会执行它在函数中遇到的任何代码,因此如果您以后想将脚本作为模块重用,这可以保护您。

    这只是一个成语,main在python中没有特殊含义,所以你不必调用它或任何东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-21
      • 2011-07-06
      • 2010-09-28
      • 1970-01-01
      • 2018-02-03
      • 2011-06-25
      • 1970-01-01
      • 2014-03-15
      相关资源
      最近更新 更多