感谢您看到这一点,我一直在考虑这几个小时无济于事。从本质上讲,我希望使我的代码更具模块性和可共享性:您可以看到以下文件最初是如何构成一个更大的代码。它不起作用,我怀疑这是因为我正在尝试用Python做一些我不应该做的事情:
app_config.py
:
app_name = "quick scraper"
mysql_db = ... # intended "global" variable that connects to database
main.py
:
from app_config import * # Getting shared variables
import app_library # See code app_library.py below
...
logger = logging.getLogger(app_name) # logger object to be shared later
...
app_library.dlAndSaveWebpage(url) # Module has key helper functions
...
app_library.py
:
import app_models_orm as app_models
def dlAndSaveWebpage(url)
# download and process url
...
app_models.Webpage.create(url=url, body=body)
app_models_orm.py
:
class MySQLModel(Model):
class Meta:
database = mysql_db
class Webpage(MySQLModel):
id = ...
...
MySQLModel
的类app_models_orm.py
失败,因为文件中不存在变量mysql_db
。我可以执行import app_config
,但我希望同一目录中的多个脚本使用app_models_orm.py
。如果我必须将自定义文件导入到脚本中,那么我必须制作模型文件的副本,这看起来很奇怪和错误。
同样,我希望在同一目录中使用多个脚本的app_library.py
。从app_library
调用main.py
似乎是有意义的,但如果app_library
需要直接从app_config.py
引用变量,我还必须制作{{1}的副本}}
app_library.py
包含一个main.py
对象,当所有这些代码放在一个文件中时,所有各种方法都可以访问/使用。怎样(或应该?)logger
函数如何访问记录器类的这个实例?
再次感谢您的帮助。在这个例子中,随意“教我如何捕鱼”:我看到很多关于使用全局导入文件的帖子,但这无助于分享后两个文件而不添加自定义导入,也没有帮助模型文件,导入时会遇到错误,因为类正在寻找不在文件中的变量。可能有一种正确的方法可以做到这一切,我想你们中的许多人都知道如何。
答案 0 :(得分:2)
为了使代码更加模块化,第一步始终是将所有全局变量移动到“config”对象中。在一个简单的版本中,它为您提供了一个全局变量,您的所有代码都共享。 app_name = "quick scraper"
成为:
class Config(object):
def __init__(self):
self.app_name = "quick scraper"
config = Config()
然后您可以这样使用:
logger = logging.getLogger(config.app_name)
在下一步中,您将代码更改为使用类,这些类将当前配置的引用作为__init__
参数。这允许你有几个配置并摆脱所有全局变量:
class Main(object):
def __init__(self, config):
self.config = config
self.logger = logging.getLogger(self.config.app_name)
...
self.app_library = AppHelper(self.config)
self.app_library.dlAndSaveWebpage(url)
这意味着您需要将所有(或大部分)函数转换为辅助类的方法。