我正在研究这个Python模块,它由几个文件组成 . 这些文件实际上很少是独立的,并且意味着要做一个非常具体的工作 . 我知道这样一个事实:这些文件只有一个实例(模块?),而且不多,因为这种工作是顺序的,只需要一次 .

让我们以我正在构建的这个 CXXParser 模块为例:

该例程简单明了 - 获取一个c文件,解析它,然后将其转换为其他内容 . 由于我来自c世界,我立即开始在Python中寻找静态方法和单例 . 对于这个例子的使用,我有'public' parse 函数和这个模块的许多'inner'函数,它实际上解析了文件 .

我想知道,'Pythonic'这样做的方法是什么?我开始四处寻找正确的方法,但只是感到困惑 . 因为我想到了单身 - 我看到this question,从阅读答案开始我就在模块级实现了它 . 但是,再一次,我观看了Python核心开发人员Raymond Hettinger的视频,并且他提到了几次 global variables are bad ,并且最好使用类级变量 .

这些是我目前面临的两个选择:

A. Use a class with classmethods:

#cxxparser.py
class CXXParser(object):
    filename = ''
    cflags   = ''
    translation_unit = None

    def __init__(self, filename, cflags = None):
        super(CXXParser, self).__init__()
        filename = filename
        if cflags:
             cflags = cflags

    @classmethod
    def get_tu(cls):
        'get the tu from the file'
        return tu

    @classmethod
    def parse(cls):
        ...
        #call some inner functions
        #for example:
        translation_unit = cls.get_tu()

并从另一个模块使用:

from cxxparser import CXXParser
cxxparser = CXXParser('Foo.c')
cxxparser.parse()

B. Use module-level functions, with globals:

#cxxparser.py
translation_unit = None
filename = ''

def get_tu(file):
    'get the tu from the file'
    return tu

def parse(filename='', cflags = None):
    global translation_unit
    global filename

    filename = filename
    if cflags:
         cflags = cflags
    ...
    #call some other functions
    translation_unit = get_tu(filename)

并从另一个模块使用:

import cxxparser
cxxparser.parse('Foo.C')

附: - 我试图尽我所能阅读它,并且遇到了这些问题 - module-function-vs-staticmethod-vs-classmethod-vs-no-decorators-which-idiom-is?python-class-design-staticmethod-vs-method,但即使在阅读了更多这些问题之后 - 我决定在我的情况下最好的方法 . 任何帮助将不胜感激 .