V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jakeyfly
V2EX  ›  问与答

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

  •  
  •   jakeyfly · 2018-03-17 20:07:57 +08:00 · 1419 次点击
    这是一个创建于 2433 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    不过这种黑魔法还是少用, 定义一个函数挺好的
    Zzzzzzzzz
        5
    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
        6
    pkookp8  
       2018-03-17 21:14:18 +08:00 via Android
    reload 和 exec,了解一下?
    polythene
        7
    polythene  
       2018-03-17 21:18:47 +08:00
    楼上各位大佬的黑魔法尽量不要用,还是封装成函数,每次调用的时候产生一个随机数比较正常
    jakeyfly
        8
    jakeyfly  
    OP
       2018-03-17 21:20:29 +08:00
    大佬们的元类 我看了就头疼 上回写个代理池 我参考别人一个 就是元类写的 我直接改成类方法的 太可怕了 那个要是出错了 根本想不到是那里的问题
    ipwx
        9
    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
        10
    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
        11
    wd  
       2018-03-17 21:26:11 +08:00 via iPhone
    没看懂。你是不是需要一个实例变量?
    littlewey
        12
    littlewey  
       2018-03-17 23:11:27 +08:00 via iPhone
    去定义一个 class 使用时候实例化它比较自然吧。
    包里的东西只 import 时候执行一次。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5845 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:55 · PVG 10:55 · LAX 18:55 · JFK 21:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.