如何移除嵌套字典中literal_str值外层的单引号
问题
读取Excel文件转换为字典后,基于该字典创建嵌套字典时遇到问题:键pattern的值需要是自定义类literal_str的实例,但当前输出中该值外层带有单引号,变成了字符串形式,不符合需求。需要移除单引号,让pattern指向literal_str的实例。
当前输出
{'rules': {'VALID_CUSTOMER_ID': {'rule_type': 'REGEX', 'dimension': 'accuracy', 'params': {'pattern': 'literal_str("^[0-9]+$")'}}}}
预期输出
{'rules':{'VALID_CUSTOMER_ID':{'rule_type': 'REGEX','dimension':'accuracy','params': {'pattern': literal_str('^[0-9]+$')}}}}
原始代码
import openpyxl import yaml from yaml.representer import SafeRepresenter class folded_str(str): pass class literal_str(str): pass class literal_unicode(str): pass def change_style(style, representer): def new_representer(dumper, data): scalar = representer(dumper, data) scalar.style = style return scalar return new_representer class MyDumper(yaml.Dumper): def increase_indent(self, flow=False, indentless=False): return super(MyDumper, self).increase_indent(flow, False) represent_literal_str = change_style('|', SafeRepresenter.represent_str) yaml.add_representer(literal_str, represent_literal_str) wb = openpyxl.load_workbook('C:\\Users\\Desktop\\config.xlsx') ws = wb['rule'] final = {} excel_read = {} def iter_rows(active): for row in active.iter_rows(): # data = [cell.value for cell in row] # print(type(data)) yield [cell.value for cell in row] res = iter_rows(ws) keys = next(res) for new in res: excel_read = dict(zip(keys, new)) print(excel_read) #Create rule for YAML output_rules = {} temp = {} temp['pattern'] = excel_read['pattern'] output_rules = temp.copy() temp.clear() temp['params'] = {} temp['params'] ['pattern'] = output_rules['pattern'] output_rules = temp.copy() temp.clear() temp = { key: excel_read[key] for key in ('rule_type', 'dimension') } output_rules = (temp | output_rules) temp.clear() # print("The output is:" ,output) temp[excel_read['rules']] = output_rules output_rules = temp.copy() temp.clear() temp['rules'] = output_rules output_rules = temp.copy() temp.clear() print(literal_str.__name__) str_rep = str(output_rules['rules'][excel_read['rules']]['params']['pattern']) print(str_rep.replace(str_rep,f'literal_str("{str_rep}")')) newstr = str_rep.replace(str_rep,f'{literal_str.__name__}("{str_rep}")') output_rules['rules'][excel_read['rules']]['params']['pattern'] = newstr print(output_rules)
解决方案
你当前的核心问题是用字符串拼接生成了literal_str的调用文本,而不是直接创建类实例。不需要用字符串替换的方式,直接用Excel读取到的pattern值实例化literal_str即可。
修改后的关键代码
替换原来最后一段的字符串处理逻辑:
# 直接用Excel读取的pattern值创建literal_str实例 pattern_value = excel_read['pattern'] output_rules['rules'][excel_read['rules']]['params']['pattern'] = literal_str(pattern_value) print(output_rules)
额外优化:简化字典构建逻辑
你之前的字典构建过程过于繁琐,可以简化成直接嵌套的字典字面量,减少临时变量和copy操作,降低出错概率:
# 简化后的字典构建逻辑 rule_key = excel_read['rules'] output_rules = { 'rules': { rule_key: { 'rule_type': excel_read['rule_type'], 'dimension': excel_read['dimension'], 'params': { 'pattern': literal_str(excel_read['pattern']) } } } } print(output_rules)
解释
- 原来的代码通过字符串拼接生成的是
'literal_str("^[0-9]+$")',这只是一个普通字符串,不是literal_str类的实例。 - 直接调用
literal_str(pattern_value)会创建真正的类实例,完全符合预期输出的格式要求。
内容的提问来源于stack exchange,提问作者RoxaneFelton
相关产品推荐
相关产品推荐

