我正在研究这个Python模块,它由多个文件组成。这些文件实际上很少是独立的,并且意味着要做一个非常具体的工作。我知道这个文件只有一个实例(模块?),而且不多,因为这种工作是顺序的,只需要一次。
让我们以我目前正在构建的CXXParser
模块为例:
例程简单明了 - 获取c ++文件,解析它,然后转换'它是另一回事。由于我来自c ++世界,我立即开始在Python中寻找静态方法和单例。
对于这个例子的使用,我有' public' parse
功能,以及许多内部功能该模块的功能,实际解析文件。
我想知道,' Pythonic'这样做的方法?我开始四处寻找正确的方法,但只是感到困惑。因为我想到了单身 - 我看到了this question,并且通过阅读答案,我开始在模块级实现它。但是,再一次,我观看了 Raymond Hettinger,Python核心开发人员的几个视频,他几次提到全局变量不好 ,并且使用类级变量会更好。
这是我目前面临的两个选择:
:一种。使用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中。使用模块级函数,使用全局变量:
#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')
P.S。 - 我试着尽我所能阅读,并遇到了这些问题 - module-function-vs-staticmethod-vs-classmethod-vs-no-decorators-which-idiom-is?,python-class-design-staticmethod-vs-method,但即使在阅读了更多这些内容之后 - 我仍然无法确定在我的情况下最佳方法。 任何帮助将不胜感激。