2

我正在一个大型代码库中重构一个 python 函数。目前,它看起来像:

def GetEvents(file_path):

    ...

    return events #a list of Event objects

一堆代码依赖于这个函数已经返回了一个列表对象。但是,我想对其进行重构,使其返回:

def GetEvents(file_path):

    ...

    return (events, event_header)

其中 event_header 是对这组事件的一点描述。但是,这将严重破坏当前期望返回列表而不是元组的所有代码。在任何其他语言中,我会通过引用传递 event_header,但我认为我不能在 Python 中做到这一点。我还可以声明另一个函数 GetEventsAndHeader(),但这会笨拙地重复功能。

建议?

4

3 回答 3

8

将函数重命名GetEventsAndHeader()为,并添加一个新函数GetEvents()

def GetEvents(*args, **kw):
    return GetEventsAndHeader(*args, **kw)[0]

或者只是硬着头皮更新所有调用代码GetEvents()并调整该代码以使用索引到的返回[0]值或使用标头。

于 2013-08-01T17:40:40.420 回答
6

如果您不是绝对需要返回元组,只需在返回的列表中添加一个属性:

class EventList(list):
    pass


def GetEvents(file_path):

    ...

    events = EventList(events)
    events.event_header = some_header
    return events
于 2013-08-01T17:49:03.650 回答
0

好吧,如前所述,如果这不带参数,那么它可能不应该是一个函数。我要补充一点,它可能是一个对象的一部分,如果不是,它应该是。

这样,您可以拥有:

class EventGroup(object):

     def GetEvents(): # note camelcase is not pep8 compliant
         return dat_list


     def EventGroupInfo():
         return some_info

     def fact_about_events1():
         return fact1

     def fact_about_events2():
         return fact2

我已经使用无参数方法来并行您的代码,但我不一定推荐它。

另一种设计选择是返回一个尊重完整列表协议的对象,并且还携带有关事件组的元数据。

于 2013-08-01T17:48:05.443 回答