Python中如何通过类实例属性动态访问模块中的指定列表?
Python中如何通过类实例属性动态访问模块中的指定列表?
首先,你遇到的核心问题是动态访问模块中的变量——Python不支持db.{self.listname}这种字符串插值式的属性访问语法,得用getattr()函数来实现这个需求。另外,你原来的清理逻辑把元组转成字符串再处理,会破坏原有的数据结构,咱们一起把这两个问题都解决掉。
问题分析
- 动态属性访问错误:
db.{self.listname}是无效语法,Python无法识别这种写法。要根据字符串名称获取模块里的变量,必须用getattr()函数。 - 数据结构破坏:你把元组转成逗号分隔的字符串处理,最后返回的是字符串列表,而不是保持原有的元组列表结构,这会导致后续使用数据时很麻烦。
- 变量名冲突:用
list作为变量名会覆盖Python内置的list类型,这是不好的编程习惯,要避免。
修正后的代码
下面是调整后的CleaningTool类,既解决了动态访问模块列表的问题,又保留了原数据结构,同时完成清理需求:
import re import database as db class CleaningTool: def __init__(self, listname): self.listname = listname def clean(self): # 动态获取database模块中指定名称的列表 target_list = getattr(db, self.listname) cleaned_list = [] for item in target_list: cleaned_elements = [] for element in item: # 第一步:转成小写 lower_element = element.lower() # 第二步:去掉括号里的年份(正则匹配" (四位数字)"的格式,更精准) no_date_element = re.sub(r' \(\d{4}\)', '', lower_element) cleaned_elements.append(no_date_element) # 把处理后的元素转回元组,保持原数据结构 cleaned_list.append(tuple(cleaned_elements)) return cleaned_list
代码解释
- 动态访问模块列表:
getattr(db, self.listname)是关键——它接收模块对象和属性名称字符串,返回模块中对应名称的变量(这里就是你要清理的列表)。比如传入"films",就会返回db.films列表。 - 保留原数据结构:遍历每个元组,逐个处理里面的字符串元素,最后把处理后的元素重新组合成元组,这样返回的结果和原列表结构一致,方便后续使用。
- 精准清理日期:把正则表达式改成
r' \(\d{4}\)',只匹配括号里的四位数字(也就是年份),避免误删电影名称中可能存在的其他括号内容。 - 兼容单元素元组:比如
friends列表里的("Lucie",),遍历的时候会正常处理这个单元素,不会报错。
测试使用
你可以这样调用这个工具,不管是清理films还是后续新增的列表,都能直接使用:
# 清理films列表 film_cleaner = CleaningTool("films") cleaned_films = film_cleaner.clean() print(cleaned_films) # 清理friends列表 friend_cleaner = CleaningTool("friends") cleaned_friends = friend_cleaner.clean() print(cleaned_friends)
运行后,cleaned_films里的电影名会变成小写且去掉年份,介质格式也统一为小写;cleaned_friends里的人名和电影名也会按规则处理,同时保留原有的元组结构。
备注:内容来源于stack exchange,提问作者Grégory Perney
相关产品推荐
相关产品推荐

