testpy 目录下三个文件:
ran.py:
import random
r = random.random()
print(f"in ran: {r}")
m1.py:
import ran
print(f"in m1: {ran.r}")
m2.py:
import m1
import ran
print(f"in m2: {ran.r}")
运行结果,ran 模块仅运行一次,m1 和m2 输出相同:
$ python3 m2.py
in ran: 0.8289859988038359
in m1: 0.8289859988038359
in m2: 0.8289859988038359
在上一层目录运行效果一样。
下面在重现项目与原始可执行文件都运行过,效果相同。
ran.ul
using random
r = random.random()
println("in ran: `r`")
m1.ul
using ran
println("in m1: `ran.r`")
m2.ul
using m1
using ran
println("in m2: `ran.r`")
运行:
$ 木兰 m2.ul
in ran: 0.2811855461755428
in m1: 0.2811855461755428
in ran: 0.9042687949191152
in m2: 0.9042687949191152
看起来ran在 m1 中运行一次,m2 中又运行一次。那么m1 和 m2 输出不同,符合预期。
下面是麻烦:
在 test1 目录下,用包路径引用:
ran.ul 内容与上相同
m1.ul
using * in test1.ran
println("in m1: `r`")
m2.ul
using * in test1.m1
using * in test1.ran
println("in m2: `r`")
在 test1 上层目录运行:
$ 木兰 test1/m2.ul
in ran: 0.29099387217334816
in m1: 0.29099387217334816
in ran: 0.1756060479173832
in m2: 0.29099387217334816
ran 虽然运行两次,但 m1 和 m2 输出相同!为何??
最后再对换引用顺序:
m3.ul
using * in test1.ran
using * in test1.m1
println("in m3: `r`")
运行输出中 m1 和 m2又不同:
$ 木兰 test1/m3.ul
in ran: 0.33903961152784223
in ran: 0.40607927379699993
in m1: 0.40607927379699993
in m3: 0.33903961152784223
看起来,默认设定是同首次引用捆绑。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
几种引用方式的测试小结在 《木兰语言多次引用模块的行为小结》,对应实现细节待深究。
虽然 #I37WKB:模块无属性报错信息与原始 exe 有区别 已解决,但导入模块部分代码(环境.py
中的 加载木兰模块
方法)仍待消化。
登录 后才可以发表评论