美文网首页测试开发思科DevNetpython基础学习
python_跨文件之间真正的全局变量传参

python_跨文件之间真正的全局变量传参

作者: 古佛青灯度流年 | 来源:发表于2016-09-22 18:49 被阅读6601次
    • 需求:

    • A.py文件中的得到参数value,需要在B.py文件中使用value的值

    • 解决思路:

    • 1.全局变量只能在当前文件中生效,所以即使将value声明为全局变量也不能在B.py中使用

    • 2.这个需求给人的一种错觉就是,跟引用函数差不多,我在B中引用A是不是可行呢?答案是否定的,引用的过程中并不能将该参数值进行存储

    • 3.联想到一种参数传递方法,在主函数中(主文件)给参数赋值,在子文件中调用:

       import Main.py
       Main.value
      

    ,这种方法可行,但是条件比较苛刻,对参数源要求比较高,并不是在任意路径都能使用的

    • 解决方法:

      • 综合以上4中方式,可以找出可行方法:设置中间文件保持 value

    • 具体实现:

    • 通过使用java的map联想到python中可以通过字典来实现一个大集合的全局变量的方法

    # 拼装成字典构造全局变量  借鉴map  包含变量的增删改查
    map = {}
    def set_map(key, value):
        map[key] = value
    def del_map(key):
        try:
            del map[key]
        except KeyError:
            print "key:'"+str(key)+"'  不存在"
    def get_map(key):
        try:
            if key in "all":
                return map
            return map[key]
        except KeyError as e:
            print "key:'"+str(key)+"'  不存在"
    
    • 方法进阶

    class GlobalMap:
        # 拼装成字典构造全局变量  借鉴map  包含变量的增删改查
        map = {}
    
        def set_map(self, key, value):
            if(isinstance(value,dict)):
                value = json.dumps(value)
            self.map[key] = value
    
    
        def set(self, **keys):
            try:
                for key_, value_ in keys.items():
                    self.map[key_] = str(value_)
                    log.debug(key_+":"+str(value_))
            except BaseException as msg:
                log.error(msg)
                raise msg
    
        def del_map(self, key):
            try:
                del self.map[key]
                return self.map
            except KeyError:
                log.error("key:'" + str(key) + "'  不存在")
    
    
        def get(self,*args):
            try:
                dic = {}
                for key in args:
                    if len(args)==1:
                        dic = self.map[key]
                        log.debug(key+":"+str(dic))
                    elif len(args)==1 and args[0]=='all':
                        dic = self.map
                    else:
                        dic[key]=self.map[key]
                return dic
            except KeyError:
                log.warning("key:'" + str(key) + "'  不存在")
                return 'Null_'
    
    
    • 总结:

    • 方法很简单,一看就能懂,但是为啥没想到呢,一是经验不足,二是要经常总结,学会真正的举一反三

    @晴 --2016-09-22 18:49:47

    相关文章

      网友评论

      • d5f6f61d74d1:我的也不能运行:NameError: global name 'value' is not defined
        求楼主再看下是哪里的问题,只是把globalValue.py代码最后一行缩进了一下,其它都没变,B文件print b时,报的上面的错
        d5f6f61d74d1:@古佛青灯度流年 初学者,这个更新的看不懂
        古佛青灯度流年:我又更新了一版,用最新的吧
        古佛青灯度流年:我的框架都是这么用的,肯定是你用的方式有问题,再没赋值之前就引用了
      • tcwaily:name 'value' is not defined

        怎么破
        古佛青灯度流年:@Miuccica 你要用一个类把这两个方法包起来
        8ac4ad45b706:@古佛青灯度流年 我也是报同样的错,就是在get_value():那里,说value没定义。代码就是用的你的~
        古佛青灯度流年:@tcwaily 你哪里写错了吧,拿上来看看
      • 陆潇华:照抄的但是失败了,怎么破!?
        第一 global不能作为import的名字不合法。中间名字的脚本不能写成global.py
        第二当前目录的话是不是就不需要加from PATH
        第三还是失败了
        古佛青灯度流年:@陆潇华 1.多谢纠错啊,直接用global确实不可以,写简书的时候没注意;现在已更改为:globalValue.py
        2.如果引用文件与被引用文件在同一目录就不需要from了
        3.应该是可行的,我这没问题

      本文标题:python_跨文件之间真正的全局变量传参

      本文链接:https://www.haomeiwen.com/subject/zywzettx.html