Python设计模式,交叉导入

时间:2009-08-26 11:43:00

标签: design-patterns python-3.x python

我使用Python来自动化一个选项很少的复杂过程。 我想在python中有以下结构。 - 一个包含流量的“流级” - 一个包含许多“黑盒子”的辅助类(通常不会更改的功能)。

99%的时间,我修改了流类中的内容,所以我只想要经常修改的代码,所以我不必滚动很多东西来找到我想要修改的代码。此类还包含经常更改的全局变量(配置设置)。辅助类包含通常不会更改的全局变量。

在flow-class中,我有一个全局变量,我希望用户在每次运行时都被强制输入。这条线看起来像这样。 print(“你想看看调试输出(输入=否)?”) debug = getUserInput()

getUserInput()函数应位于辅助类中,因为它永远不会被修改。 getUserInput需要一个来自flow类的全局变量,它指示用户输入是否应该与Linux命令行或Eclipse(在Windows上运行)一致。

我的问题是:我怎样才能以最好的方式构建它?目前它看起来如下: 流程类:

import helper_class

isLinux = 1

debug = getUserInput()

助手级:

import os, flow_class

def getUserInput():
    userInput = input ()
    if (flow_class.isLinux == 1):
        userInput = userInput[:-1]
    return userInput

由于交叉导入,这当前给出了以下错误:

Traceback (most recent call last):
  File "flow_class.py", line 1, in <module>
    import helper_class
  File "helper_class.py", line 1, in <module>
    import os, flow_class
  File "flow_class.py", line 5, in <module>
    debug = getUserInput()
NameError: name 'getUserInput' is not defined

我知道我显然可以通过将isLinux作为参数传递给getUserInput来解决这个问题,但这会使这种方法的使用变得复杂并使其不那么直观。

3 个答案:

答案 0 :(得分:2)

您需要在helper_class.getUserIinput()flow_class。这不是交叉导入。一旦修复,你将获得与交叉导入确实相关的AttributeError

在此阶段,您需要在导入getUserInput之前实施定义flow_class的逻辑。

评论你最后的陈述:你的假设不正确。如果使用显式本地值,代码会更清晰。

答案 1 :(得分:1)

  

我知道我显然可以通过将isLinux作为参数传递给getUserInput来解决这个问题,但这会使这种方法的使用变得复杂并使其不那么直观。

实际上使用全局变量使这个程序的使用变得复杂,而不仅仅是一个简单的参数。

尝试类似:

debug = getUserInput(isLinux=True)

以下是其他一些建议

  • 你提到有很多参数你经常会改变。它们应该硬编码吗?尝试使用a configuration file,或者从'flow'传递dict()作为参数。这样你就可以在不必潜入的情况下改变常见变量!
  • 你的'flow / helper'类听起来像Controller/Model范例。这很好。但您的模型不应该导入您的控制器。

这些不是针对'pythonic style'的建议,这些是一般编程实践。如果您关注程序设计,请尝试阅读The Pragmatic Programmer,他们有很好的工作流程和设计技巧。罗伯托也提出了Code Complete

答案 2 :(得分:1)

我想问你最后一句话。

通常,如CC2中所述,全局变量的使用有助于编写代码,但不能用于阅读代码。
并且代码的读取次数比写入的次数多很多次;在你的情况下,我知道你一遍又一遍地修改同一个脚本。

您现在面临的问题只是通用设计决定使用全局变量的结果 显式参数传递会使其更清晰,更易于维护。

正如Python的禅宗所说,explicit is better than implicit