gpt4 book ai didi

python - 从函数返回多个值的非侵入式方法?

转载 作者:行者123 更新时间:2023-12-04 12:31:20 25 4
gpt4 key购买 nike

我正在处理一个大型代码库,我想知道在不改变所有用途的情况下向函数添加额外返回值的非侵入性方法是什么。例如:

现有设置:

def foo():
return 'bar'

re = foo()

我的尝试:

def foo():
return 'bar', 'baz'


re, _ = foo() # re has a correct value but I had to add `, _` in all uses
re = foo() # Error: re is now a tuple, thus semantic has changed.

最佳答案

了解您只能返回一个值非常重要,该值可能是一个容器,如元组,就像您的第二个示例一样。但它始终是单一类型。

如果您更改返回值,那么您不能指望没有下游影响,除非您将值更改为某个 LSP。兼容的子类型。在这种情况下,如果您不想破坏下游用途,您可以返回一些具有额外属性的字符串子类型

class StringWithMetadata(str):
def __new__(cls, obj, metadata=None):
return super().__new__(cls, obj)
def __init__(self, obj, metadata=None):
# note, ignoring obj
self.metadata = metadata # or whatever appropriate name you want


def foo():
return StringWithMetadata('bar', 'baz')

re = foo()
print(re, re.metadata)

编辑:

看到你用 Python 2.7 标记了这个(如果可以的话你真的应该避免这个),那么你可以使用 super 的长格式:

return super(StringWithMetadata, cls).__new__(cls, obj)

或者只是明确的方式(你总是可以这样做):

return str.__new__(cls, obj)

关于python - 从函数返回多个值的非侵入式方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68838923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com