You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Erlang格式字符串列表转为Python列表?遇SyntaxError报错

问题

我在主类中调用了如下函数:

def get_tote_task_ttp_list_not_complete(self, butler_host):
    try:
        server_ip = coreApi._env_details['BUTLER_SERVER']
    except TypeError:  # TypeError is raised when we fetch data from None
        server_ip = butler_host

    obj = ErlangArg(server_ip)
    out = obj.erl_multiple_arg('tote_task', 'search_by', ["[{status, notequal, complete}],[task_key,tote_id]"])
    status = out.lstrip('{ok,').rstrip('}').strip('""')
    return status

主类调用代码:

jai = gmc.get_tote_task_ttp_list_not_complete("172.29.2.54")
print(jai)
print(type(jai))

输出结果:

[[<<"a29c4601-68a1-40e3-b986-50c8ec65bf18">>,<<"TOTE1">>],
     [<<"03a89100-18cb-4f06-821b-b368b86f8829">>,<<"TOTE2">>],
     [<<"8897a38e-cfaf-4983-afc2-fcdcaf7ef59d">>,<<"TOTE10">>]]

<class 'str'>

我需要将这个字符串转换为Python列表,期望的结构是:

[<<"a29c4601-68a1-40e3-b986-50c8ec65bf18">>,<<"TOTE1">>],[<<"03a89100-18cb-4f06-821b-b368b86f8829">>,<<"TOTE2">>],[<<"8897a38e-cfaf-4983-afc2-fcdcaf7ef59d">>,<<"TOTE10">>]

尝试用ast.literal_eval()转换时出错:

import ast

def get_tote_task_ttp_list_not_complete(self, butler_host):
    try:
        server_ip = coreApi._env_details['BUTLER_SERVER']
    except TypeError:  # TypeError is raised when we fetch data from None
        server_ip = butler_host

    obj = ErlangArg(server_ip)
    out = obj.erl_multiple_arg('tote_task', 'search_by', ["[{status, notequal, complete}],[task_key,tote_id]"])
    status = out.lstrip('{ok,').rstrip('}').strip('""')

    # Convert status string to list
    status_list = ast.literal_eval(status)

    return status_list

错误信息:

File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ast.py", line 50, in parse
    return compile(source, filename, mode, flags,
  File "<unknown>", line 1
    [[<<"a29c4601-68a1-40e3-b986-50c8ec65bf18">>,<<"TOTE1">>],
      ^^
SyntaxError: invalid syntax

如何解决这个问题,成功将目标字符串转换为Python列表?

解决方案

问题核心是Erlang返回的<<"xxx">>格式不是Python合法语法,ast.literal_eval()无法识别。需要先将Erlang二进制字符串格式替换为Python兼容格式,再进行转换。

修改后的函数代码

import ast

def get_tote_task_ttp_list_not_complete(self, butler_host):
    try:
        server_ip = coreApi._env_details['BUTLER_SERVER']
    except TypeError:  # TypeError is raised when we fetch data from None
        server_ip = butler_host

    obj = ErlangArg(server_ip)
    out = obj.erl_multiple_arg('tote_task', 'search_by', ["[{status, notequal, complete}],[task_key,tote_id]"])
    status = out.lstrip('{ok,').rstrip('}').strip('""')

    # 替换Erlang二进制字符串格式为Python兼容格式
    python_compatible_str = status.replace('<<', '').replace('>>', '')
    # 转换为Python列表
    status_list = ast.literal_eval(python_compatible_str)
    
    # 若需要生成期望的逗号分隔子列表格式,可执行以下操作
    desired_output = str(status_list)[1:-1]
    return status_list  # 按需返回Python列表或desired_output格式字符串

关键步骤说明

  1. 格式替换:将字符串中的<<"和">>替换为空,让<<"TOTE1">>变为"TOTE1",符合Python字符串语法规则。
  2. 列表转换:修改后的字符串可被ast.literal_eval()正常解析,得到可操作的Python列表。
  3. 生成目标格式:如果需要得到指定的逗号分隔子列表格式,只需将转换后的列表转为字符串,再去掉最外层的[和]即可。

内容的提问来源于stack exchange,提问作者Jaideep Kaushik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:22:55