22 Star 121 Fork 26

木兰编程语言/mulan-rework

 / 详情

【待研究】同一模块被多处引用时,在不同目录下运行的行为不同

待办的
任务 拥有者
创建于  
2020-12-17 15:21

python 作对比测试

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

评论 (7)

吴烜 创建了任务 4年前
吴烜 关联仓库设置为木兰编程语言/mulan-rework 4年前
展开全部操作日志

看起来,默认设定是同首次引用捆绑。

384016 zhishi 1578922186 吴烜 拥有者 4年前

@dwcz 你好!从 m2.ultest1/m3.ul 看来是首次引用有效。主要的困惑是 test1/m2.ul,它的引用顺序与 m2.ul 相同(都是先 m1 后 ran),只是添加了一层包路径,但行为却不同:

$ 木兰 test1/m2.ul
in ran: 0.29099387217334816
in m1: 0.29099387217334816  <------ m1 输出
in ran: 0.1756060479173832
in m2: 0.29099387217334816  <------ m2 输出,与 m1 的相同

@zhishi 会不会是ran.r起得作用--指定了绑定“ran.r”。而r没有指定,一般是指本文档的,所以,用的都是第一次引进的“r”。

384016 zhishi 1578922186 吴烜 拥有者 4年前

@dwcz 果然。将 test1/m2.ul 改为如下测试:

using test1.m1
using test1.ran

println("in m2: `test1.ran.r`")

行为就与 m2.ul 相同了:

$ 木兰 test1/m2.ul 
in ran: 0.34318311521101874
in m1: 0.34318311521101874
in ran: 0.7576525230620492
in m2: 0.7576525230620492

多谢提供线索!接下去也许要从引用和变量 scope 两方面实现继续研究。

384016 zhishi 1578922186 吴烜 拥有者 4年前

此 commit 可见,python 的绝对(输出 2)与相对(输出 1)调用也有语义差别,此行为与木兰对应代码相同。

384016 zhishi 1578922186 吴烜 拥有者 4年前

几种引用方式的测试小结在 《木兰语言多次引用模块的行为小结》,对应实现细节待深究。

384016 zhishi 1578922186 吴烜 拥有者 4年前

虽然 #I37WKB:模块无属性报错信息与原始 exe 有区别 已解决,但导入模块部分代码(环境.py中的 加载木兰模块 方法)仍待消化。

登录 后才可以发表评论

状态
负责人
项目
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
预计工期 (小时)
开始日期   -   截止日期
-
置顶选项
优先级
里程碑
分支
参与者(2)
dwcz-dwcz 384016 zhishi 1578922186
Python
1
https://gitee.com/MulanRevive/mulan-rework.git
git@gitee.com:MulanRevive/mulan-rework.git
MulanRevive
mulan-rework
mulan-rework

搜索帮助