gpt4 book ai didi

python 导入循环依赖(也许还有函数声明)

转载 作者:行者123 更新时间:2023-11-28 20:19:31 25 4
gpt4 key购买 nike

你好,除了加倍代码之外,我确实陷入了循环依赖,这是不可重构的。

我有这样的东西(只是更复杂):

我的解析器.py:

import sys
import main #comment this to make it runnable
def parseEvnt():
sys.stdout.write("evnt:")
main.parseCmd(1) #comment this to make it runnable

tbl.py:

import myParser
tblx = {
1:("cmd",),
2:("evnt",myParser.parseEvnt),
}

主要.py:

import tbl
def parseCmd(d):
print(tbl.tblx[d][0])
data=[1,2]
for d in data:
if(d<2):
parseCmd(d)
else:
fce = tbl.tblx[d][1]
fce()

我得到的明显错误是:

File "D:\Data\vbe\workspace\marsPython\testCircular2\main.py", line 1, in <module>
import tbl
File "D:\Data\vbe\workspace\marsPython\testCircular2\tbl.py", line 1, in <module>
import myParser
File "D:\Data\vbe\workspace\marsPython\testCircular2\myParser.py", line 2, in <module>
import main
File "D:\Data\vbe\workspace\marsPython\testCircular2\main.py", line 7, in <module>
parseCmd(d)
File "D:\Data\vbe\workspace\marsPython\testCircular2\main.py", line 3, in parseCmd
print(tbl.tblx[d][0])
AttributeError: module 'tbl' has no attribute 'tblx'

在 C 中,我想我会通过 tbl.py 中的声明告诉我,嘿,有函数 parseEvnt()。我不需要包含 myParser 并且不会有循环包含。

在 python 中我不知道该怎么做。

我读了几篇文章,总有一些聪明人建议重构。但在这种情况下,parseCmd() 需要查看 tblx,而 tblx 需要查看 parseEvnt()(除非函数声明)和 parseEvnt( ) 需要调用parseCmd() (因为evnt 包含触发cmd 而我不想加倍解码cmd 代码) .

有没有办法让它在 python 中工作?

最佳答案

只要模块在所有导入完成之前不尝试使用彼此的数据,您就可以经常摆脱循环依赖 - 实际上,这意味着使用命名空间进行引用(from module import something 被禁止)并且只在函数和方法中使用其他模块(全局空间中没有 mystuff = module.mystuff)。这是因为当导入开始时,python 将模块名称放入 sys.modules 并且不会再次尝试导入该模块。

您遇到麻烦是因为当您运行 main.py 时,python 将 __main__ 添加到 sys.modules。当代码最终转到 import main 时,模块列表中没有“main”,因此 main.py 再次导入......及其顶级代码试图运行。

让我们重新安排您的测试用例并放入一些打印语句以告知导入何时发生。

myParser.py

print('  + importing myParser')
import sys

print('import parsecmd')
import parsecmd
def parseEvnt():
sys.stdout.write("evnt:")
parsecmd.parseCmd(1)

tbl.py

print('  + importing tbl')
print('import myParser')
import myParser
tblx = {
1:("cmd",),
2:("evnt",myParser.parseEvnt),
}

Parsecmd.py(新)

print('  + importing parsecmd')
print('import tbl')
import tbl
def parseCmd(d):
print(tbl.tblx[d][0])

主.py

print('running main.py')

print('import parsecmd')
import parsecmd

if __name__ == "__main__":
data=[1,2]
for d in data:
if(d<2):
parsecmd.parseCmd(d)
else:
fce = parsecmd.tbl.tblx[d][1]
fce()

当我运行它时,我得到

running main.py
import parsecmd
+ importing parsecmd
import tbl
+ importing tbl
import myParser
+ importing myParser
import parsecmd <-- didn't reimport parsecmd
cmd
evnt:cmd

关于python 导入循环依赖(也许还有函数声明),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34362687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com