我使用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来解决这个问题,但这会使这种方法的使用变得复杂并使其不那么直观。
答案 0 :(得分:2)
您需要在helper_class.getUserIinput()
中flow_class
。这不是交叉导入。一旦修复,你将获得与交叉导入确实相关的AttributeError
。
在此阶段,您需要在导入getUserInput
之前实施定义flow_class
的逻辑。
评论你最后的陈述:你的假设不正确。如果使用显式本地值,代码会更清晰。
答案 1 :(得分:1)
我知道我显然可以通过将
isLinux
作为参数传递给getUserInput来解决这个问题,但这会使这种方法的使用变得复杂并使其不那么直观。
实际上使用全局变量使这个程序的使用变得复杂,而不仅仅是一个简单的参数。
尝试类似:
debug = getUserInput(isLinux=True)
以下是其他一些建议
这些不是针对'pythonic style'的建议,这些是一般编程实践。如果您关注程序设计,请尝试阅读The Pragmatic Programmer,他们有很好的工作流程和设计技巧。罗伯托也提出了Code Complete。
答案 2 :(得分:1)
我想问你最后一句话。
通常,如CC2中所述,全局变量的使用有助于编写代码,但不能用于阅读代码。
并且代码的读取次数比写入的次数多很多次;在你的情况下,我知道你一遍又一遍地修改同一个脚本。
您现在面临的问题只是通用设计决定使用全局变量的结果 显式参数传递会使其更清晰,更易于维护。
正如Python的禅宗所说,explicit is better than implicit。