【问题标题】:Convert a string to a tuple [duplicate]将字符串转换为元组 [重复]
【发布时间】:2015-09-25 04:32:25
【问题描述】:

我从一个文件中读取了一些元组数据。元组是字符串形式的,例如Color["RED"] = '(255,0,0)'。如何将这些字符串转换为实际的元组?

我想像这样在 PyGame 中使用这些数据:

gameDisplay.fill(Color["RED"])
# but it doesn't have the right data right now:
gameDisplay.fill('(255,0,0)')

【问题讨论】:

    标签: python string parsing pygame tuples


    【解决方案1】:

    您可以使用ast 模块的literal_eval

    ast.literal_eval(node_or_string)

    安全地评估包含 Python 文字或容器显示的表达式节点或 Unicode 或 Latin-1 编码字符串。提供的字符串或节点只能由以下 Python 文字结构组成:字符串、数字、元组、列表、字典、布尔值和无。

    例子:

    >>> import ast
    >>> ast.literal_eval("(255, 0, 0)")
    (255, 0, 0)
    >>>
    

    关于pygame,注意Color class也可以将颜色的名称作为字符串:

    >>> import pygame
    >>> pygame.color.Color('RED')
    (255, 0, 0, 255)
    >>>
    

    所以也许你通常可以简化你的代码。

    另外,你不应该命名你的 dict Color,因为 pygame 中已经有 Color 类,这只会导致混乱。

    【讨论】:

    • 我导入的颜色比 pygame 的还多!
    【解决方案2】:

    你可以使用ast.literal_eval() -

    例子-

    import ast
    ast.literal_eval('(255,0,0)')
    >>> (255, 0, 0)
    

    在你的情况下 -

    gameDisplay.fill(ast.literal_eval(Color["RED"]))
    

    请注意,ast.literal_eval 将评估表达式(即字符串)并返回结果。

    来自documentation-

    ast.literal_eval(node_or_string)

    安全地评估包含 Python 文字或容器显示的表达式节点或 Unicode 或 Latin-1 编码字符串。提供的字符串或节点只能由以下 Python 文字结构组成:字符串、数字、元组、列表、字典、布尔值和无。

    【讨论】:

      【解决方案3】:

      其他答案使用ast模块,但同样的事情可以使用内置函数eval来完成。

      >>> mystring = '(255,0,0)'
      >>> eval(mystring)
      (255,0,0)
      

      See the docs for more info.

      【讨论】:

      • 是的,eval 也可以。但这是不好的做法,因为它不安全(允许运行任意代码),而 literal_eval 只允许字符串、数字、元组、列表、字典、布尔值和无。
      • 直到看到这个问题,我才意识到,我什至不知道eval 的替代方案,但现在阅读它似乎是避免它的好主意。
      猜你喜欢
      • 2014-09-21
      • 2018-11-11
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多