Python优雅编程(二)

关于日常使用到的一些Python技巧,计划用五个章节完成分享。

使用isinstance来校验类型

因为基于内建类型扩展的用户自定义类型,type()不能准确返回结果,因此在校验对象类型的时候,建议使用isinstance()函数,两者异同如下:

  • type用于获取一个未知对象的数据类型,isinstance用于判断一个对象是否是已知类型;
  • type不认为子类的实例化对象属于父类类型,isinstance认为子类的实例化对象属于父类类型,即子类对象也属于父类类型;
  • 示例:两者都可以用来检测某一变量是否属于某一数据类型

    输出 True

    示例:两者都可以检测实例化对象是否属于某一个类

    输出 True

    示例:isinstance()能够判断出子类的实例化对象属于父类,但是type()则不能。

    输出 True False

    使用literal_eval替代eval

    eval()函数将字符串str当成有效的表达式来求值并返回计算结果。其中包含如下三个参数:

  • source:必填,一个Python表达式的字符串或者compile()返回的代码对象
  • globals:非必填,必须是dictionary
  • locals:非必填,任何映射对象,默认与globals参数一致
  • eval()函数将任何字符串当做表达式处理,如果globals,locals参数都不指定,表达式将在eval调用的环境中执行,即默认为globals()和locals()函数中包含的所有模块和函数,这就使得eval方法存在一定的安全风险。

    假设用户输入的是”__import__(‘os’).system (‘dir’)”,输出又会是什么呢?会看下它打印了当前目录的所有文件列表,如下

    ast.literal_eval()方法会判断需要计算的内容计算后是否是安全、合法的Python类型,如果是则进行运算,否则会直接抛出异常。

    输出

    因此推荐使用ast.literal_eval替代eval。


    str() 和repr() 的区别

  • str()面向用户,返回用户对友好、可读性强的字符串类型;
  • repr()面向 Python 解释器或开发人员,返回 Python 解释器内部的含义;
  • 解释器中输入string默认调用repr(),而print(string)默认调用str();
  • repr()返回值一般可以用eval()还原对象:obj == eval(repr(obj));
  • 输出 True [1,2,3,4] '[1,2,3,4]'

    判断对象是否为空

    在Python中,None、空列表[]、空字典{}、空元组()、0等一系列代表空和无的对象会被转换成False。除此之外的其它对象都会被转化成True。

    输出 True

    若对你有所帮助,欢迎大家评论、留言、关注,感谢支持!

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2019年3月3日
    下一篇 2019年3月3日

    相关推荐