通过引用传递布尔参数
Pass boolean argument by reference
在 C++ 中,您始终可以将某些内容作为引用传递,调用者只需检查引用的变量即可知道调用方发生的任何事情。
想象一下这个场景:
def x():
a = f()
print(a)
def f():
return "hello"
我想要的是添加一个布尔标志,returns 从 f 到 x。有几种方法可以做到这一点:
- 使 f return 成为元组 (str,bool)
- 将对布尔变量的引用传递给 f
选项 1 目前不可能,因为 f() 有很多调用者,我无法更改它们以接受元组作为 return 值,因此它必须保持原样。
选项 2 不可能,因为布尔参数是不可变的(正如我最近了解到的)。
只有f可以计算布尔值,x需要知道。
有什么好的方法可以实现吗?在一般的 Python 编码中寻找一些不错的做法。
最接近将 pointer/reference 传递给 f
的选项是将它传递给一个可变对象,例如列表:
def f(ok=None):
if isinstance(ok, list):
ok.append(True)
return "hello"
def x():
ok = []
a = f(ok)
print(a, ok.pop())
但 IMO 更好的解决方案是 return 一个元组,并将该行为重构为一个新函数,这样您就可以共享代码而不会干扰现有的 API:
def f_with_flag():
return "hello", True
def f():
return f_with_flag()[0]
def x():
a, ok = f_with_flag()
print(a, ok)
在 C++ 中,您始终可以将某些内容作为引用传递,调用者只需检查引用的变量即可知道调用方发生的任何事情。
想象一下这个场景:
def x():
a = f()
print(a)
def f():
return "hello"
我想要的是添加一个布尔标志,returns 从 f 到 x。有几种方法可以做到这一点:
- 使 f return 成为元组 (str,bool)
- 将对布尔变量的引用传递给 f
选项 1 目前不可能,因为 f() 有很多调用者,我无法更改它们以接受元组作为 return 值,因此它必须保持原样。
选项 2 不可能,因为布尔参数是不可变的(正如我最近了解到的)。
只有f可以计算布尔值,x需要知道。
有什么好的方法可以实现吗?在一般的 Python 编码中寻找一些不错的做法。
最接近将 pointer/reference 传递给 f
的选项是将它传递给一个可变对象,例如列表:
def f(ok=None):
if isinstance(ok, list):
ok.append(True)
return "hello"
def x():
ok = []
a = f(ok)
print(a, ok.pop())
但 IMO 更好的解决方案是 return 一个元组,并将该行为重构为一个新函数,这样您就可以共享代码而不会干扰现有的 API:
def f_with_flag():
return "hello", True
def f():
return f_with_flag()[0]
def x():
a, ok = f_with_flag()
print(a, ok)