Python 里 引包的值的问题,可能比较偏门

2018-03-17 20:07:57 +08:00
 jakeyfly

比如我在的 A.py 里定议了一个变量 aaaa=random.ranint() 然后我在 b.py 多个地方引用这个变量 其值是一样的,不会变化。有没有办法 在 b.py 里不同的地方使用这个值可以像这个变量是在本地文件里一样 会随机变化的?

1424 次点击
所在节点    问与答
12 条回复
ballshapesdsd
2018-03-17 20:09:38 +08:00
aaaa 不是计算好的随机值么,怎么会变化,你不要骗我
jingniao
2018-03-17 20:16:02 +08:00
python 导入规则,导入的时候会运行这个文件,所以,运行时,随机数被确认
然后模块级别的变量是单例的,所以其他地方用这变量都是一致
jakeyfly
2018-03-17 20:29:40 +08:00
@jingniao 有没有办法不一样呢。比如 把他变成一个函数之类的 调用是否可以?
Zzzzzzzzz
2018-03-17 20:34:36 +08:00
启动文件里定义一个继承 types.ModuleType 的 class, 里面用 property 封装一个类函数, 灌进 sys.modules 里

不过这种黑魔法还是少用, 定义一个函数挺好的
Zzzzzzzzz
2018-03-17 20:42:04 +08:00
In [1]: import sys, types, random

In [2]: class DummyModule(types.ModuleType): value = property(lambda _: random.randint(1, 10000))

In [3]: sys.modules['dummy_module'] = DummyModule('dummy_module')

In [4]: import dummy_module

In [5]: dummy_module.value
Out[5]: 8462

In [6]: dummy_module.value
Out[6]: 4497

In [7]: dummy_module.value
Out[7]: 876

In [8]: dummy_module.value
Out[8]: 7946

大致就是这样, 不过真这么玩儿, 出点问题排查起来很麻烦的
pkookp8
2018-03-17 21:14:18 +08:00
reload 和 exec,了解一下?
polythene
2018-03-17 21:18:47 +08:00
楼上各位大佬的黑魔法尽量不要用,还是封装成函数,每次调用的时候产生一个随机数比较正常
jakeyfly
2018-03-17 21:20:29 +08:00
大佬们的元类 我看了就头疼 上回写个代理池 我参考别人一个 就是元类写的 我直接改成类方法的 太可怕了 那个要是出错了 根本想不到是那里的问题
ipwx
2018-03-17 21:20:58 +08:00
你为啥要让这个 module level 的值变化?用个函数不好吗?

hack 的方法总是有的,但是这违背了 python 程序的一般形式,是不好的。

另外原则上你只有 from A import aaaa 才会让 aaaa 的变更无法作用于 B。事实上 import A,然后用 A.aaaa 的话,你总是可以重新设置 A.aaaa = random.randint(),并且影响到 B 的。
ipwx
2018-03-17 21:22:05 +08:00
比如你在 A.py 里面:

__aaaa = [None]

def reset_aaaa(): __aaaa[0] = random.randint()

def get_aaaa(): return __aaaa[0]

reset_aaaa()

这样不是就很好嘛?
wd
2018-03-17 21:26:11 +08:00
没看懂。你是不是需要一个实例变量?
littlewey
2018-03-17 23:11:27 +08:00
去定义一个 class 使用时候实例化它比较自然吧。
包里的东西只 import 时候执行一次。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/438975

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX