You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python重载同名函数:实现两种特征设置函数的最简方案

问题:实现两个版本的特征设置函数的最简方法?

我需要实现两个版本的特征设置函数:一个接收全部特征并将其拆分为单词和短语,另一个接收已拆分好的单词和短语作为参数。现有代码如下,请问实现这一需求的最简单方法是什么?

现有代码:

def set_features_2(self, words, phrases):
    self.vocabulary = set(words)
    self.phrases = SortedSet(phrases)
def set_features(self, features):
    phrases = [f for f in features if ' ' in f]
    words = [f for f in features if f not in phrases]
    self.set_features_2(words, phrases)

回答

嘿,其实你现在的写法已经是非常简洁且合理的实现方式了!核心思路就是让两个函数各司其职,完全符合代码复用的最佳实践:

  • set_features_2 专注于最终的特征赋值逻辑,只需要把传入的已拆分好的单词和短语存入实例变量就行;
  • set_features 则专门干预处理拆分的活儿,把原始特征列表拆成单词和短语后,直接调用set_features_2来完成后续操作,完全避免了重复代码。

如果想要让代码更优雅一点,可以做两个小优化:

  1. set_features_2改个更语义化的名字,比如叫_set_features_from_split(用下划线开头暗示这是内部方法,不建议外部直接调用),这样其他开发者一看就知道这个函数是给内部拆分后的特征用的;
  2. 拆分单词的时候,把短语列表改成集合:
def set_features(self, features):
    phrases = {f for f in features if ' ' in f}  # 用集合代替列表,提升查询效率
    words = [f for f in features if f not in phrases]
    self._set_features_from_split(words, phrases)

因为集合的in操作是O(1),而列表的in操作是O(n),当特征数量很大的时候,这个小改动能明显提升性能。

总的来说,你当前的实现已经是“最简且职责清晰”的方案了——复用已有逻辑,不重复造轮子,完全踩中了DRY原则(Don't Repeat Yourself)的点~

内容的提问来源于stack exchange,提问作者Alicja Głowacka

火山引擎 最新活动