将元组字符串转换为字符串元组

run*_*run 7 python

我的意见是:

input = ['(var1, )', '(var2,var3)']
Run Code Online (Sandbox Code Playgroud)

预期产出是:

output = [('var1', ), ('var2','var3')]
Run Code Online (Sandbox Code Playgroud)

迭代输入并在元组字符串上使用eval/ literal_eval是不可能的:

>>> eval('(var1, )')
>>> NameError: name 'var1' is not defined
Run Code Online (Sandbox Code Playgroud)

如何将项目转换为'(var1, )'元组,其中内部对象被视为字符串而不是变量?

有没有比编写解析器或使用正则表达式更简单的方法?

vau*_*tah 12

对于每次出现的变量,eval在符号表中搜索变量的名称.可以提供自定义映射,该映射将返回每个缺失键的键名:

class FakeNamespace(dict):
    def __missing__(self, key):
        return key
Run Code Online (Sandbox Code Playgroud)

例:

In [38]: eval('(var1,)', FakeNamespace())
Out[38]: ('var1',)

In [39]: eval('(var2, var3)', FakeNamespace())
Out[39]: ('var2', 'var3')
Run Code Online (Sandbox Code Playgroud)

注意: 如果没有,则将eval当前全局变量复制到提交的globals字典中__builtins__.这意味着表达式可以访问内置函数,异常和常量,以及命名空间中的变量.您可以尝试通过传递来解决这个问题FakeNamespace(__builtins__=<None or some other value>)而不仅仅是FakeNamespace(),但它不会eval100%安全( Python eval:如果我禁用内置和属性访问,它仍然是危险的吗?)


Wil*_*ill 5

试试这个:

tuples = [tuple(filter(None, t.strip('()').strip().split(','))) for t in input]
Run Code Online (Sandbox Code Playgroud)

例如:

In [16]: tuples = [tuple(filter(None, t.strip('()').strip().split(','))) for t in input]

In [17]: tuples
Out[17]: [('var1',), ('var2', 'var3')]
Run Code Online (Sandbox Code Playgroud)

我们遍历我们的元组字符串列表,并为每个字符串删除()s,然后将字符串拆分为列表,,然后将列表转换回元组.我们filter()用来删除空元素.