本文由Markdown语法编辑器编辑完成。

1. Python

在来新公司前,也间断地接触过Python编程,比如医学影像处理的图像库VTK就已经有Python的实现;Paraview也可以开启Python的监测,将用户在界面上的操作录制成Python脚本,供之后再进行重复调用。在人工智能领域,Python更是应用广泛,各种深度学习的框架,都是用Python语言撰写。

进入了新公司后,除了前端是用JS实现外,其余模块的后端语言都是用Python实现。因此,我在近一个月的工作中,也是在边学边用Python。虽然说编程语言的思想都基本相同,但有时候还是会由于一些编程思想的疏忽,引起一些问题。这里记录一下最近这段时间,在代码review的过程中,发现的一些编码问题。对于自己在软件架构,编程思想等方面的提高做一些必要的积累。

2. Python的编码思想和规范

(1) Python的异常处理

Python的异常处理类似于Java,也是通过try...catch的语法块来进行异常捕捉。一般在工程项目中,需要在有异常或错误的地方记录相应级别的日志。那么什么时候去记录日志,什么时候去抛异常,是抛程序自己的异常,还是为了统一格式而抛自己提前定义好的异常,这些都是需要提前定义好编码规则的。

先说一个原则就是:在函数的调用关系中,当最底层的函数运行有异常时,可以记录异常的日志,抛异常时需要抛原始的异常,而不应该抛自己定义的异常。 因为如果抛自己定义的异常,这样在调用该函数时,虽然依然可以捕捉到自己定义的异常,但是会丢失掉原来异常的链,也就是无法追踪到最原始的引起异常的地方。

(2)慎用成员变量

Python虽然是非编译性语言,但是它也具有面向对象的特性,因此可以用Python创建类,类里可以定义属性和方法。但是,这里一定要慎用属性(成员变量)。因为如果将一个属性定义为成员变量,那么这个属性值会随着这个类的对象一直存在。这样,如果在只创建一个类的对象,而多次用不同的参数来调用这个类的方法时,有可能会因为这个类的成员变量值,由于还保存着上一次调用时的值,而直接作用于下一次的函数调用,从而产生无法预知的错误。

之前,我无意识地将一个属性设置为成员变量后,在调用类的方法时,不管外边传入的参数是什么值,输出始终都是固定不变的。当时百思不得其解,后来通过debug代码,才发现原来是由于将一个变量设置为了成员变量,而且这个成员变量是一个list. 所以每调用一次函数,都相当于往这个list类型的成员变量里面append一个元素,而最后输出的值是这个list的第一个元素。因此不管用什么参数来调用这个函数,始终输出的都是第一次调用时的那个返回值(list的第一个元素)。根本原因,就是每次调用完这个函数后,没有将这个成员变量清空而导致的。找到问题后,将这个成员变量修改为局部变量。这样每次调用完函数后,这个局部变量便会被销毁。之前遇到的问题也就迎刃而解了。

(3)Python多线程引起的问题

之前在实现一个基于python的第三方库 filesystem的ftp连接,下载文件和关闭ftp连接时,由于没有意识到多线程的问题,而发生了意想不到的错误。

在自己本地开发测试时,由于没有用多线程来测试,因此只是按照只有一个线程的思维,首先根据ftp的连接参数创建ftp连接,然后再根据传入的根目录下载文件,下载完毕后关闭ftp连接。看起来这个流程是没有问题的。但是,当真正在多线程的环境下开始测试的时候,程序便在“关闭ftp连接时报错。”出错的原因是说,不能关闭未连接的ftp。

当时一直没有想明白是什么原因,既然代码已经走到了关闭连接的地方,那么必然是之前先连接了ftp,并且已经完成了文件下载的呀,怎么会提示要关闭的ftp是未连接状态的呢。

后来,在同事的提醒下,知道这个是多线程的。因此,其实是同时有很多的线程在运行,而且由于整个多线程,是共用着一个ftp连接。因此,完全有可能一个线程刚把ftp连接起来,当这个线程完成了下载文件的操作后,准备去关闭这个ftp连接时,却发现这个ftp连接已经被先于它下载完文件的线程给关闭了ftp连接。因此,才会发生前文中的异常。

了解了问题的根源后,便可以对症下药了。那就是在每次关闭线程时,不能像原来那样,直接把成员变量的ftp(当时是将ftp的连接设置为成员变量了)连接给关闭。这个ftp连接,当时除了基本的ip,username, password外,还有一个root_path。而每一个root_path其实是不同的。因此,本质上这个ftp的连接,其实如果加上后面的root_path是不同的。但是如果只以前面的三个参数连接时是相同的。

因此,最终的解决思路是,不降ftp连接作为成员变量,而是每次将在下载文件前建立的ftp连接对象(由: ip, username, password和root_path构成的连接串)返回,关闭ftp连接时,关闭返回来的这个ftp连接。这样,就能保证每一个线程关闭的ftp连接都是属于这个线程特有的ftp连接,而不会去关闭大家公用的那个ftp主连接(由: ip, username, password)。这样多线程之间便不会相互干扰了。

3. 参考链接

python在日常工作处理中的应用-近期工作中应用Python的一些经验总结相关推荐

  1. python在日常工作处理中的应用-python在工作中的应用场景介绍

    python在工作中的应用场景介绍 发布时间:2020-04-21 14:44:30 来源:亿速云 阅读:277 作者:小新 今天小编给大家分享的是python在工作中的应用场景介绍,相信很多人都不太 ...

  2. python在日常工作处理中的应用-谈谈Python在工作中的应用

    最近在一些地方用到了Python,在这里总结一下. 首先要明确的是:语言是为工作服务的.这样就不太容易陷入xx是宇宙最好的语言这种无聊的比较和讨(si)论(bi)之中.而且大牛们基本上都精通多种语言, ...

  3. python在日常工作处理中的应用-Python全栈开发在实际工作中的应用

    2012年,SEO行业分为两派--技术派和理论派,技术派认为应该深入理解搜索引擎工作原理. 学会web开发,这样做SEO才能走得远;理论派则认为只要掌握理论,会不会编程无所谓.当时SEO人员纷纷站队, ...

  4. python在日常工作处理中的应用-记 Python 在实际工作中的第一次应用

    今儿接到一个任务处理上线脚本,在明确了要求之后,寻思再三,为了以后能循环使用,这次得进行脚本化才好,于是就开始了我的拙劣码风. 画风其实是这样的. 有一个文件里面有些数据,需要遍历出每行,然后分别取到 ...

  5. python在日常工作处理中的应用-Python在工作中的应用

    记住代码都是别人的哪都是,那不是你的,别直接自己运行真把他弄懂 例1:文件批量处理 对文件进行批量重命名,将文件夹中所有的文件名的"scroll_1"替换为"scroll ...

  6. java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本

    举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...

  7. 在学Python前学Linux,Python原来这么好学-1.2节: 在Linux中安装python

    这里将告诉您Python原来这么好学-1.2节: 在Linux中安装python,具体操作过程:在Linux系统的主要发行版中,按其软件包格式来进行划分,可分为Deb系以及RPM系操作系统.Linux ...

  8. 人事工作中的Python运用——离职证明生成器

    人力资源管理工作的其他Python运用 人事工作中的Python运用--批量劳动合同+实习协议_派圣的博客-CSDN博客 相信大家工作中,会时常有员工向我们所要离职证明或者实习协议,遇见我们人事工作手 ...

  9. python提高办公效率-几个可以提高工作效率的Python内置小工具

    在这篇文章里,我们将会介绍4个Python解释器自身提供的小工具.这些小工具在笔者的日常工作中经常用到,减少了各种时间的浪费,然而,却很容易被大家忽略.每当有新来的同事看到我这么使用时,都忍不住感叹, ...

最新文章

  1. 买台式电脑还是笔记本好?
  2. 面试问Kafka,这一篇全搞定
  3. aic bic mdl
  4. java实现对英文字母去重_LeetCode算法题-Unique Morse Code Words(Java实现)
  5. 计算机专业开学周记,【热门】开学周记集锦5篇
  6. linux中多进程调试,linux下用gdb调试多进程
  7. 为什么要返回function_宇宙飞船返回时,为什么要冒着烧毁的风险加速穿过大气层?...
  8. webservice项目部署部署到weblogic报错之解决方案
  9. 顶会集结+深度解析:医疗+AI如此火爆,NLP如何赋能?
  10. 设计模式---代理模式(c++实现)
  11. shell应用之监测电脑内存、负载和磁盘的使用情况
  12. Microsoft Operations Framework 4.0
  13. swift4 label显示html,Swift:在标签或textView中显示HTML数据
  14. dos命令安装windows系统
  15. Token验证失败的解决方法
  16. STM32F103_study67_The punctual atoms(STM32 OLED display experiment)
  17. sqlmap中的tamper 脚本分析
  18. 笔记2 IKAnalyzer扩展词库
  19. MongoTemplate 聚合查询
  20. strtok、strtok_s、strtok_r 字符串分割函数

热门文章

  1. 标准模板库(STL)学习指南之vector向量
  2. FMS4.5( Adobe Flash Media Server4.5)流媒体服务器搭建
  3. C++ 内存泄露处理方法 (转)
  4. mysql date_format 按不同时间单位进行分组统计
  5. 大作完成了一部分,陆续往上放吧
  6. python和c学习-Cpython学习一:入门
  7. python爬虫图片-python爬虫(爬取图片)
  8. python小项目-python 小项目
  9. 学python要下载什么-从应用的角度去学习Python--为孩子下载课本
  10. python手册中文版apk-python怎么打包apk