• 玩转python之测试一个对象是否是类字符串


    提到类型测试,我首先想到python中“鸭子类型”的特点,所谓鸭子类型,即如果它走路像鸭子,叫声也像鸭子,

    那么对于我们的应用而言,就可以认为它是鸭子了!这一切都是为了功能复用。

    我们总是需要测试一个对象,尤其是当写一个函数或者方法时,经常需要测试传入的参数是否是一个字符串;

    下面这个方法利用了内建的isinstance和basestring来简单快速检查某个对象是否是字符串或者Unicode对象:

    def is_string(anobj):

        return isinstance(anobj, basestring)

    很多人看到这个方法会提出质疑,并用下面的方法代替之,但很遗憾,下面的方法有严重漏洞:

    def is_string(anobj):

        return type(anobj) is type(' ')

    python强大力量的源泉——平滑的、基于签名的多态机制告诉我们,这个方法很糟糕,很明显,Unicode对象

    便无法通过这个测试,更不用提用户自己编写的str子类了;

    而使用isinstance和basestring的方法则要好很多,因为str和Unicode有共同的基类;但仍有漏网之鱼:

    UserString模块提供的UserString类,就不适用以上方法;

    这忽然让我想起了一个著名的处理问题方式,同时也是try/except工具的保证:获得事后原谅总是比获得事前许可,

    要容易的多(EAFP);所以,也许我们可以自己做些什么:

    def islikestring(anobj):

        try:    anobj + ' '

        except:  return False

        else:    return True

    关键词:鸭子判断法、EAFP、isinstance、basestring

  • 相关阅读:
    数据结构与算法
    ROS 机器人技术
    我常用的 VSCode C:C++ 插件!
    Ubuntu 常用的录屏、截图、Gif 软件!
    从 0 开始机器学习
    Word 设置页码从指定页开始的详细步骤!
    Ubuntu16.04 更新 ruby-2.6!
    配置 Git 不用每次 push 都输入密码!
    解决 rubygems.org 无法访问的问题!
    PHP 反序列化漏洞入门学习笔记
  • 原文地址:https://www.cnblogs.com/thinker-lj/p/3919709.html
Copyright © 2020-2023  润新知