python - 如何在 Python 中正确定义一个跨包全局的变量?
问题描述
有两个文件a.py
并b.py
具有以下内容按预期工作:
# a.py
import b
def a_logger(msg):
print("a logger:", msg)
b.run()
b.set_logger(a_logger)
b.run()
# b.py
def b_logger(msg):
print("b logger:", msg)
def set_logger(logf):
global b_logger
b_logger = logf
def run():
b_logger('hello world!')
印刷
b logger: hello world!
a logger: hello world!
移入b.py
模块也可以。但是,当按如下方式组织为一个包时,它会中断:
# aa.py
import bb
def a_logger(msg):
print("a logger:", msg)
bb.run()
bb.set_logger(a_logger)
bb.run()
# __init__.py
from .bb import set_logger
from .cc import run
# bb.py
def _bb_logger(msg):
print("b logger:", msg)
def set_logger(logf):
global _bb_logger
_bb_logger = logf
# cc.py
from .bb import _bb_logger
def run():
_bb_logger('hello world!')
印刷
b logger: hello world!
b logger: hello world!
显然,cc.py
保留自己的_bb_logger
. 为什么,以及如何获得预期的行为?
一些观察:
- 使用类或列表来包含函数有效,所以问题似乎是重新分配
- 将
from .bb import _bb_logger
语句移动到run
函数中也可以
解决方案
推荐阅读
- java - 用于创建/更新和删除 AWS Workdocs 审批工作流程的 API
- mysql - 在Alpine下的VM上安装Mysql
- flutter - 在颤振中使用共享首选项将数据保存为对象
- powerbi - 部署后将新列从 ssas 添加到 Power BI
- ruby-on-rails - 无法将 sqlite3 与 ruby 和 rails 集成
- perl - 是否可以在不定义 getter 的情况下访问 Perl 包的 ATTR?
- python - django在(djongo)mongodb表中存储字符串而不是字典对象(无模式),同时使用jsonfield存储动态dict数据
- json - 将 PointFeild 转换为 JSON 对象
- mysql - 为旧版本的 Rails 安装旧版 mysql
- javascript - 迭代具有条件的对象数组