代码之家  ›  专栏  ›  技术社区  ›  skybunk

python:动态类型转换-unicode对象到python对象的转换

  •  4
  • skybunk  · 技术社区  · 7 年前

    这是我在数据管道项目中面临的一个问题。 我有两个数据源。一个包含所有用户数据,另一个包含从用户数据到输出的所有列的元数据。

    所以python很擅长动态类型转换,就像我说的

    a = float
    b = "25.123"
    c = a(b)
    print(c)
    >> 25.123
    

    这就是我想做的,我想动态地键入cast值,以便正确地处理它们。该类型从元数据数据源中检索。 问题是,当我对元数据执行django模型查询时,会得到unicode对象。

    a = model.objects.filter(id = 'id') # get the type variable from the meta-data
    a = a[0]['type']
    print(a)
    >> u'float'
    a("123.123")
    >> TypeError: 'unicode' object is not callable
    

    如何将此u“float”转换为float? 这种方法有更好的选择吗? 我退房了 this ,但它不起作用

    欢迎所有建议

    3 回复  |  直到 7 年前
        1
  •  7
  •   Taku    7 年前

    在您的第一个示例中 a = float ,则, a 是一个内置函数,但在第二个示例中, a = u"float" ,则, A. 是unicode字符串。如果希望在不需要创建映射的情况下将内置类型转换为完整的“动态”,可以执行以下操作:

    # for Python 2
    a = u"float"
    b = "123.123"
    import __builtin__
    print getattr(__builtin__, a.decode())(b) 
    # 123.123
    
    # for Python 3+
    a = u"float"
    b = "123.123"
    import builtins
    print(getattr(builtins, a)(b))
    # 123.123
    

    我会建议你 使用 eval() (根据建议 another answer )因为这可能会导致重大的安全风险。这就是为什么我使用 __builtin__ / builtins 模块和 getattr() 要检索 float(...) 作用


    您还可以创建映射(即 dict ),将unicode字符串映射到其相应的函数(建议使用 comment ):

    # both Python 2 and 3
    a = u"float"
    b = "123.123"
    mapping = {u"float": float, u"int": int, u"str": str, u"list": list}
    print(mapping[a](b))
    # 123.123
    

    使用映射是最安全的方法,但它将您的“动态性”限制为映射中列出的类型。

        2
  •  0
  •   picnix_    7 年前

    您可以使用 eval() 函数来评估代码,但您需要小心使用该函数!否则,你可以看看 post 。另一种解决方案是预先定义允许的类型,并将它们收集到字典映射中 typeName 具有 typeConstructor

        3
  •  0
  •   SpghttCd    7 年前

    你可以使用 astype 从numpy库:

    import numpy as np
    np.array(('213.123')).astype(a)
    

    诚然,这需要通过一个数组,因为 astype() 适用于numpy数组,但它可以将字符串计算为类型。