我正在研究这个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')