在Python中避免全局变量

时间:2019-11-08 12:38:22

标签: python global-variables conventions

我知道有很多与此主题相关的帖子,但是在理解这个概念时遇到了一些麻烦。因此,我写了一个脚本,而公司的CTO则责骂我,说这是不好的风格,因为它使用的对象实例是一个全局变量,仅在脚本的主要部分中创建。因此,从实例不可全局访问的其他位置导入时,该功能将无法使用。

编辑:这是投诉的确切措辞:

功能 @MockBean ,例如,使用对象实例,该对象实例是全局变量,仅在脚本的主要部分中创建。从全局范围内没有此类实例可用的其他位置导入时,此功能将不起作用。那是糟糕的编程风格。

我认为,我将对象实例传递给调用中的函数,因此,它实际上并没有使用全局变量。自从他去度假以来,没有回答过任何问题。但是,这确实需要部署,我不确定如何进行,因此我向SO寻求帮助。也许这里有人知道他的意思:)。

这是脚本的简化:

def updateValues(...)

1 个答案:

答案 0 :(得分:1)

该程序可能会起作用,但我认为这不是最佳的编程风格,正如一些评论所建议的那样。顺便说一句,我没有看到putNewValuesInDatabase的定义,所以我不知道您是否只是为了简洁而忽略了它,或者它是否会存在于导入该文件的文件中。不管。不要混淆这个问题,但这就是我可能会对此进行编码的方式(尽管由于简洁,我可能会将getInitialValues滚动到__init__方法中)

class Functions():

    def __init__(self,
                 getData,
                 makeInitialCalculations,
                 makeUpdateCalculations,
                 putNewValuesInDatabase,
                 projectID):
        self.getData = getData
        self.makeInitialCalculations = makeInitialCalculations
        self.makeUpdateCalculations = makeUpdateCalculations
        self.putNewValuesInDatabase = putNewValuesInDatabase 
        self.projectID = projectID
        self.getInitialValues()
        self.start_updates()

    def getInitialValues(self):
        time = datetime.now()
        timeseries_1, timeseries_2 = self.getData(self.projectID, time)
        self.value_1, self.value_2 = self.makeInitialCalculations(timeseries_1, timeseries_2, time)

    def updateValues(self):
        time = datetime.now()
        timeseries_1, timeseries_2 = self.getData(self.projectID, time)
        self.value_1, self.value_2 = self.makeUpdateCalculations(self.value_1, self.value_2, timeseries_1,timeseries_2)

    def start_updates(self):
        while True:
            sleep(60)
            self.updateValues()
            self.putNewValuesInDatabase(self)            

我已经将getInitialValuesupdateValues包含在您的类({不太知名的)类Functions中,并简化了界面。请注意,现在必须为此类的构造函数传递函数getDatamakeInitialCalculationsmakeUpdatecalculationsputNewValuesInDatabase,这些函数可能来自可能的客户端代码。 位于要导入该文件的其他文件中。然后,我希望客户端代码为:

obj_instance = Functions(getData, makeInitialCalculations, makeUpdateCalculations, putNewValuesInDatabase, projectID)

您可能希望不要让构造函数自动调用start_updates(或为此getInitialValues),而让客户端代码手动调用这些方法。