记 suds 模块循环依赖的坑

下面是soa接口调用的核心代码

#! /usr/bin/python
# coding:utf-8
from suds.client import Clientdef SoaRequest(wsdl,fnname,data):
    soaService = Client(wsdl).service
    soaRep = getattr(soaService,fnname)(data)
    return soaRep

问题就这样出现了:

我调用一个接口,总是报错,见下图:

之后Debug断点定位到suds模块的sxbasic.py文件中的Import类的open方法

    def open(self, options):"""
        Open and import the refrenced schema.
        @param options: An options dictionary.
        @type options: L{options.Options}
        @return: The referenced schema.
        @rtype: L{Schema}
        """
        if self.opened:
            return
        self.opened = True
        log.debug(‘%s, importing ns="%s", location="%s"‘, self.id, self.ns[1], self.location)
        result = self.locate()

        if result is None:
            if self.location is None:
                log.debug(‘imported schema (%s) not-found‘, self.ns[1])
            else:
                result = self.download(options)
        log.debug(‘imported:\n%s‘, result)
        return result
self.location 为None时日志打印,否则就执行download而我测试的接口有个这种问题,A中依赖B,B中依赖C,C中依赖A,循环依赖所有就出问题了

好吧,那就改吧在类Import外定义数组变量resultList = []
    def open(self, options):
        global resultList#声明全局变量
        if self.opened:
            return
        self.opened = True
        log.debug(‘%s, importing ns="%s", location="%s"‘, self.id, self.ns[1], self.location)
        result = self.locate()

        if result is None:
            if self.location is None:
                log.debug(‘imported schema (%s) not-found‘, self.ns[1])
            else:
                if self.location in resultList:
                    log.debug(‘location is already in resultList‘) #list中存在,即说明已完成下载
                else:
                    result = self.download(options)
                    resultList.append(self.location)#下载完成后,往list中添加记录
        log.debug(‘imported:\n%s‘, result)
        return result

这样应该没问题了吧,运行,还是报同样的错

继续调试

发现resultList一直是空,就是说下载操作完成后添加记录的操作没有执行

于是我调换了下顺序

直接成功

   def open(self, options):
        global resultList
        if self.opened:
            return
        self.opened = True
        log.debug(‘%s, importing ns="%s", location="%s"‘, self.id, self.ns[1], self.location)
        result = self.locate()

        if result is None:
            if self.location is None:
                log.debug(‘imported schema (%s) not-found‘, self.ns[1])
            else:
                if self.location in resultList:
                    log.debug(‘location is already in resultList‘)
                else:
                    resultList.append(self.location)
                    result = self.download(options)
        log.debug(‘imported:\n%s‘, result)
        return result
时间: 2024-11-08 23:55:24

记 suds 模块循环依赖的坑的相关文章

Python开发常见问题之各模块循环依赖

今天写了一个程序,由于设计上的问题,导致两个模块需要相互引用,出现了“importError”错误.分析良久,对于模块循环依赖的问题有两种方法: 1.可通过调整import导入顺序来解决,把 import 语句放到方法定义的后面即可 2.两个模块写到一个文件里面去 对于此类问题Python并没有提供解决方案,所以尽量在设计之初就要避免出现模块循环依赖问题,以免开发后期大刀阔斧的修改.

RequireJS 循环依赖报 模块undefined 处理方案

RequireJS 循环依赖 开始学习使用RequireJS之后做了几个小例子,之后想着把手头的项目也用RequireJS写一遍试试.感觉胜利就在前方了,忽然发现始终卡在一个问题上: 很常见的一个问题,根源就是获取不到当前的函数,反复检查了代码,发现并没有异常,纠结许久. 忽然想到之前看API的时候提到的“循环依赖”,当时“循环依赖比较罕见,它也是一个重构代码重新设计的警示灯.”让我直接忽略了这一部分的内容. 循环依赖,指的是两个模块之间相互依赖,即a依赖b,同时b依赖a,那么在这种情况下当b的

记一次JSON循环依赖的经历

笔者是从配置文件中读取JSON数组数据,类Metadata.class的结构如下: public class Metadata { public String id; public String codeNo; public String codeName; public String parentNo; public String description; public String state; public List<Metadata> subordinates; } JSON数据文件m

如何避免类之间的循环依赖

最近在看<Java应用架构设计 模块化模式与OSGi>,深有感触,在此做些总结.(电子版可以在Java1234.com上下载到) 在使用Java开发中,各种依赖不可避免.比如类之间的继承,jar包之间的相互依赖.依赖在某种程度上不可避免,但是过多的依赖势必会增加系统的复杂性,使代码难以阅读,从而成为团队开发的阻碍.循环依赖尤其糟糕. 循环依赖存在与多种实体之间,尤其是类.包.模块之间.当两个类相互引用时,就会出现循环依赖.下面摘抄书中的一个例子. 如图1.1所示,有Customer和Bill两

node js 循环依赖问题

循环依赖,简单点来说就是a文件中require b文件,然后b文件中又反过来require a文件.这个问题我们平时可能并不大注意到,但如果处理不好可能会引起一些让人摸不清的问题.在node中,是如何处理循环依赖的问题的呢? 写个简单的例子来试验一下看吧.定义两个文件:a.js var b = require('./b'); console.log('a.js get b:' + b.b); module.exports.a = 1;</pre>b.js var a = require('./

循环依赖问题

1:不要出现相互依赖  或者循环依赖, 最好是单向依赖   (之前pb出现循环依赖) 2:api之间不相互依赖, 只是实现之间相互依赖api,这样就不会出现循环依赖了 比如  现在的需求是  查询达人需要查询达人的行程,   查询达人的行程,也需要查询行程属于哪个达人    这个看起来似乎是 class User{ private Journey journey; } class Journey{ private User user; } 达人模块依赖于行程模块     行程模块也依赖达人模块

seaJS循环依赖的解决原理

seajs模块的六个状态. var STATUS = {  'FETCHING': 1, // The module file is fetching now. 模块正在下载中  'FETCHED': 2, // The module file has been fetched. 模块已下载  'SAVED': 3, // The module info has been saved. 模块信息已保存  'READY': 4, // All dependencies and self are r

测试一下25道Spring经典面试题你会几道?循环依赖面试详解

前言 先看看什么是循环依赖当一个ClassA依赖于ClassB,然后ClassB又反过来依赖ClassA,这就形成了一个循环依赖:ClassA -> ClassB -> ClassA循环依赖-->2个或以上bean 互相持有对方,最终形成闭环.Spring中循环依赖的场景:1.构造器的循环依赖.(spring也无能为力)2.setter循环依赖:field属性的循环依赖[setter方式 单例,默认方式-->通过递归方法找出当前Bean所依赖的Bean,然后提前缓存[会放入Cach

小小见解之python循环依赖

a.py from b import b print '---------this is module a.py----------' def a(): print "hello, a" b() a() b.py print '----------this is module b.py----------' def b(): print "hello, b" def c(): print "hello, c" c() from a import