我正在處理一個龐大的代碼庫,我想知道有什么非侵入性的方法可以在不改變所有用途的情況下為一個函式增加一個額外的回傳值。例如:
現有設定:
def foo()。
return 'bar'
re = foo()
我的嘗試:
def foo()。
return 'bar', ' baz'
re, _ = foo() # re有一個正確的值,但我必須在所有的使用中添加`, _`。
re = foo() # Error: re現在是一個元組,因此語意已經改變。
uj5u.com熱心網友回復:
理解這一點非常重要,你只能回傳一個單一的值,這個值可能是一個容器,比如元組,就像你的第二個例子。但它始終是一個單一的型別。
如果您改變了回傳值,那么您就不能指望不產生下游影響,除非您將該值改為某個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)
uj5u.com熱心網友回復:
如果你的目的是為一個使用量相對較大的函式添加儀表(即,在不改變所有使用該函式的代碼的情況下),也許沿著這些思路的東西可能會有幫助:
如果你的目的是為一個使用量相對較大的函式添加儀表(即,在不改變所有使用該函式的代碼的情況下
def foo(spy=None) 。
結果 = 'bar'
if isinstance(spy, dict)。
spy['ret'] = result
spy['other'] = 'baz'# ...
return result
舉例說明:
原來的用途可以保持不變:
r = foo()
>>> r
'bar'/span>
但是你也可以通過一個dict來從你的函式中獲得一些其他的資訊:
你可以通過一個dict來獲得一些其他的資訊。
spy = {}
r2 = foo(spy=spy)
>>> spy
{'ret'。'bar', 'other': 'baz'}。
你當然可以為你的 "間諜 "容器使用其他型別。
uj5u.com熱心網友回復:
如果你不想改變所有的用途,例如:re = foo(),那么最好保持foo回傳1個非元組值。
你應該把你的新用法放在一個不同的函式中。def _foo2(): return ('bar', 'baz')。
你也可以編輯foo,使其依賴于_foo2而不改變你代碼中其他部分的用法。def foo(): return _foo2()[0]。foo然后成為某種程度上的抽象概念。你的代碼的其余部分可以依賴于foo的特定行為。真正的作業是在其他地方完成的,例如_foo2,并且可以在任何時候改變,所有你需要做的是編輯foo一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/309366.html
標籤:
