xml地图|网站地图|网站标签 [设为首页] [加入收藏]
缓慢解决Pycharm不可能展现matplotlib绘图难题,斯维
分类:编程

介绍:

  在使用Alamofire进行网络请求的时候,相信大部分的同学都会封装一个抽象的NetworkLayer,如"APIManager" 或者 "NetworkModel"等等。但是位置业务功能增加,会渐渐混合各种请求,不够清晰,而Moya能很好地解决这类问题。Moya在Alamofire基础上进行封装,是一个允许高度自定义的网络层,可以根据具体的需求进行接口的设置。具体的介绍可以参考Moya的官方链接,结构图如下:

最近开始接触matplotlib,

AspectCore是.NET标准的基于AOP的跨平台框架【github解释】。主要支持:对方面拦截器,依赖注入集成,Web应用程序,数据验证等的核心支持。

图片 1

1.首先安装matplotlib库和其依赖的一些其他库,例如:numpy,scipy和pandas等

使用实例:

首先安装dll:

Install-Package AspectCore.Core

引用完dll就可以使用了,我们来创建基本的处理类:ErrorCommandAttribute

介绍就不说了,理论我也知道的不多,直接上代码:

图片 2图片 3

 class ErrorCommandAttribute : AbstractInterceptorAttribute
    {
        string _mess;
        public ErrorCommandAttribute(string methon)
        {
            _mess = methon;
        }
        /// <summary>
        /// 每个被拦截的方法中执行
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        public override async Task Invoke(AspectContext context, AspectDelegate next)
        {
            try
            {
                Console.WriteLine("AddAsync方法开始前");
                await next(context); // 执行被拦截的方法
            }
            catch (Exception)
            {
                Console.WriteLine("AddAsync方法出错");
                try
                {
                    //Type[] mytypes = Assembly.GetExecutingAssembly().GetTypes();
                    Type type= typeof(User);//user 是类
                    var methom = Activator.CreateInstance(type);//反射创建类
                    MethodInfo methodinfo = type.GetMethod(_mess);//获取方法 _mess参数是自定义字符串为方法名称
                    methodinfo.Invoke(methom, null);//运行方法
                }
                catch (Exception ex)
                {

                    throw;
                }
                throw;
            }
            finally
            {
                Console.WriteLine("AddAsync方法结束");
            }
        }
    }

View Code

只简单介绍下方法的形式:Invoke

该方法是继承AbstractInterceptorAttribute类之后必须实现得类;

然后try:是在方法执行之前执行;所有我们在检测方法开始之前要想做一些操作可以写在这里

catch:只有在检测的方法出现异常才会执行;这里是检测方法出异常了,需要做的操作,

finally:都会执行

我们再来看一下方法类:user

图片 4图片 5

 public class User
    {
        [ErrorCommand("Error1")]
        public virtual async Task<int> AddAsync()
        {
            Console.WriteLine("开始方法:AddAsync");
            throw new Exception("出错了");
            return 0;
        }
        public async Task<int> Error1()
        {
            Console.WriteLine("开始方法:Error1");
            return 1;
        }
    }

View Code

很明显我们写的特性类只需要在需要检测的方法上面加特性就好了。这里特别注意就是,需要加特性的方法必须是虚方法,也就是必须加virtual 修饰。不然不会被调用。

最后看一下如何使用方法:

图片 6图片 7

static void Main(string[] args)
        {
            Console.WriteLine("开始程序");
            //User user = new User();
            //user.AddAsync();
            ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();
            using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
            {
                User p = proxyGenerator.CreateClassProxy<User>();
                p.AddAsync();
            }

            Console.ReadLine();
        }

View Code

与正常的使用类方法看出来了:我们new User类的时候不是传统的方式,必须使用组件的CreateClassProxy方法;

 

2.开始进行简单的编码工作,并在PyCharm中运行,出现如下错误:

2018-06-23:

  接下来就介绍一下Moya的一些常见的用法:

Traceback (most recent call last):
  File "J:/MyGit/pythonTest/GetTegeather/test06.py", line 4, in <module>
    import matplotlib.pyplot as plt
  File "C:UsersAdministratorAppDataLocalProgramsPythonPython36-32libsite-packagesmatplotlibpyplot.py", line 115, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "C:UsersAdministratorAppDataLocalProgramsPythonPython36-32libsite-packagesmatplotlibbackends__init__.py", line 62, in pylab_setup
    [backend_name], 0)
  File "J:softwarePyCharm 2017.3.1helperspycharm_matplotlib_backendbackend_interagg.py", line 17, in <module>
    verbose = matplotlib.verbose
AttributeError: module 'matplotlib' has no attribute 'verbose'

修改拦截器方法:

拦截方法从指定类型扩展为公共方法,自定义类型,这样就可以单独提取出来,不用每一个类型写一个类,可以自动获取到类型,然后可以重复使用:

 public override async Task Invoke(AspectContext context, AspectDelegate next)
        {
            try
            {
                Console.WriteLine("AddAsync方法开始前");
                await next(context); // 执行被拦截的方法
            }
            catch (Exception)
            {
                Console.WriteLine("AddAsync方法出错");
                //重复调用示例
                ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();
                using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
                {
                    var baseClass = context.Proxy;
                    foreach (var item in baseClass.GetType().GetMethods())
                    {
                        if (item.Name.ToString() == _mess)
                        {
                            MethodInfo methodinfo = baseClass.GetType().GetMethod(_mess);
                            methodinfo.Invoke(baseClass, null);
                        }
                    }
                }

                throw;
            }
            finally
            {
                Console.WriteLine("AddAsync方法结束");
            }
        }

 

(一)根据业务需求创建具体请求:

解决步骤如下:

系列目录:

微服务系列文章主要介绍微服务所使用到的一些技术和一些技术示例:

  • 微服务——微服务的介绍和目录
  • 微服务——【Consul】服务发现在windows下简单使用(一)
  • 微服务——【polly】微服务故障处理库(二)
  • 微服务——动态代理AspectCore的使用(三) 
  • 微服务——网关Ocelot+Consul实现集群轮询(四)

  打比方现在我们需要书写账户的相关接口,如Login、userInfo。那么首先我们得创建AccountService:

前提:

enum AccountService {
    case login(phoneNum: NSInteger,passWord: NSInteger)
    case logout
}

1.导入正确版本的matplotlib库

  然后让AccountService实现TargetType协议,定义请求需要的基本信息:

2.代码最后调用matplotlibku中pyplot.show()方法

extension AccountService: TargetType {
    var baseURL: URL {
        return URL(string: ServiceBaseURL)!
    }

    var path: String {
        switch self {
        case .login(_, _):
            return "accountService/login"
        case .logout:
            return "accountService/logout"
        }
    }

    var method: Moya.Method {
        switch self {
        case .login(_, _):
            return .post
        case .logout:
            return .get
        }
    }

    var parameters: [String: Any]? {
        switch self {
        case .login(let phoneNum, let passWord):
            return ["phoneNum": phoneNum, "passWord": passWord]
        case .logout:
            return nil
        }
    }

    var parameterEncoding: ParameterEncoding {
        return JSONEncoding.default // Send parameters as JSON in request body
    }

    var sampleData: Data {
        return "".data(using: .utf8)!
    }

    var task: Task {
        return .request
    }

}

3,无其他低级错误

  如上我们就已经完成了网络请求所需要的一个endpoint。接着通过Moya提供一个发送请求的Provider就完成了基本的使用:

解决步骤:

let provider = MoyaProvider<AccountService>()

provider.request(.login(phoneNum: 12345678901, passWord: 123456)) { result in

            switch result {
            case let .success(response):
                //...............
                break
            case let .failure(error):
                //...............
                break
            }
        }

1.在导入pyplot之前.需要输入如下步骤:

(二)通过HTTPHeader设置公共请求参数

  import matplotlib as mpl

本文由澳门新葡亰手机版发布于编程,转载请注明出处:缓慢解决Pycharm不可能展现matplotlib绘图难题,斯维

上一篇:Swift基础语法,的一些新特性 下一篇:Ubuntu下将现有的文件打包成deb包,如何在Swift3中
猜你喜欢
热门排行
精彩图文