【问题标题】:Python Reflection and Type ConversionPython 反射和类型转换
【发布时间】:2010-10-11 22:50:29
【问题描述】:

在Python中,str()、int()、float()等函数一般用于进行类型转换。但是,这些要求您在开发时知道要转换为哪种类型。我正在尝试编写的一些 Python 代码的子问题如下:

给定两个变量foobar,求foo 的类型。 (在开发时不知道,因为这是通用代码。)然后,尝试将bar 转换为foo 的任何类型。如果这不能完成,则抛出异常。

例如,假设您调用了执行此操作的函数conv。它的签名看起来像

def conv(foo, bar) :
    # Do stuff.

它会被称为:

result = conv(3.14, "2.718")  # result is now 2.718, as a float.

【问题讨论】:

    标签: python reflection type-conversion introspection python-datamodel


    【解决方案1】:

    这样最好:

    type(foo)(bar)
    

    【讨论】:

    • 仅在 Python 3.0 中。在 Python 2.x 中,这仅适用于“新型类”和内置函数。
    【解决方案2】:

    使用foo.__class__ 获取foo 的类型。然后调用它将 bar 转换为 foo 的类型:

    def conv(foo, bar) :
        return foo.__class__(bar)
    

    当然,这只有在 foo 的类型有一个知道如何转换 bar 的构造函数时才有效。

    【讨论】:

    • 令人印象深刻。我从来没有想过它会如此简单。同样令人惊讶的是(我是 Python 新手,并且习惯于更接近金属语言)它可以与内置函数一起使用。
    • 部分不正确。 foo.__class__ 只是 foo 的类型,如果 foo 是一个新样式的对象。否则,它只是类。
    • 唯一不正确的,因为当类更精确时我说“类型”。但是他需要这个转换的类。而在 Python 3 中,差异已经消失了。
    【解决方案3】:
    type(foo)
    

    绝对是最好的,如果你想检查一个类型,那么“类型”是最好的方法,我在python 2.7 - 3.2.2, type() 上工作得很好。

    【讨论】:

      猜你喜欢
      • 2018-01-30
      • 1970-01-01
      • 2012-01-13
      • 2021-07-05
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多