"introspect" 函数内的预期数量 returns
"introspect" expected amount of returns within function
大家好,
我目前正在开发一个 python 模块,为同事提供使用工具,我试图提供的一些功能可以 return 相当多的有用信息(例如,5 return 值),但在大多数用例中,只需要前两个。
我知道 python 非常适合编写高度动态的程序,特别是因为我们可以询问有关当前 运行 系统的信息,所以我想搜索一下,但我似乎无法找到寻找。 (我发现了很多有趣的讨论,但没有真正讨论我的问题。)
有没有办法从函数内部知道预期的 return 值的数量?
例如,可以有函数:
def lazyOdd():
return 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21
将使用 one, three, five = lazyOdd()
调用。
编辑:显然一点都不清楚,我寻找的是这样的:
def lazyReturn():
return (val1, val2) if expectedReturns == 2 else (val1, val2, val3, val4)
我知道在这种情况下,这绝对不是继续进行的最佳方式,几乎任何一种可迭代对象都可以,但是对于根本没有链接的值,它不会那么简单。如果可能的话,因为大多数用例将只使用两个结果,我想避免 returning 一个大元组,因为许多同事甚至不知道 return 其他人的功能值,它会很容易出错。
我能做到吗?
编辑: 另外,我不介意解决方案是否包含一些开销,因为我很可能会通过不处理最后三个值来赢得很多时间。
Edit²:也许最好的方法真的是传递另一个指定预期值数量的参数?
我不太明白你想做什么。函数返回的元组中元素的数量由函数决定,或者更具体地说,由编写函数的程序员决定。如果您的同事只对前两个元素感兴趣,他们可以这样做:
one, three, *_ = lazyOdd()
_ 是一个垃圾变量,用于存储元组的其余部分。
缓存
从你的描述中很难判断,但你似乎需要caching。
这样你就可以写多个函数了。一个用于繁重的计算,其他的输出正确的格式和值的数量。如果重计算以相同的输入值第二次调用,则返回之前的结果。
from functools import lru_cache
@lru_cache(maxsize=32)
def heavy_common_calculation(x):
print("HEAVY CALCULATION FOR %d. Should only be done once!" % x)
result = x**2
return result
def get_two_values(x):
return x, heavy_common_calculation(x)
def get_four_values(x):
y = heavy_common_calculation(x)
return x, y, y**2, y**3
print(get_two_values(3))
# HEAVY CALCULATION FOR 3. Should only be done once!
# (3, 9)
print(get_four_values(3))
# (3, 9, 81, 729)
发电机
你想实施 generator 吗?
def lazyOdd():
x = 1
while True:
yield x
x = x + 2
odd_gen = lazyOdd()
print(next(odd_gen))
# 1
print(next(odd_gen))
# 3
print(next(odd_gen))
# 5
print(next(odd_gen))
# 7
如果你想要一个值,它会被计算出来。如果你不需要它,什么都不会发生,什么都白算。
len(odd_gen)
未定义,因为它会启动无限循环。
关键字参数
您可以使用一个参数来告诉函数您需要多少个结果:
def f(x, detail='low'):
a, b = x, x**2
if detail == 'high':
return a, b, 'something', 'else'
else:
return a, b
print(f(3))
# (3, 9)
print(f(3, detail='high'))
# (3, 9, 'something', 'else')
大家好,
我目前正在开发一个 python 模块,为同事提供使用工具,我试图提供的一些功能可以 return 相当多的有用信息(例如,5 return 值),但在大多数用例中,只需要前两个。
我知道 python 非常适合编写高度动态的程序,特别是因为我们可以询问有关当前 运行 系统的信息,所以我想搜索一下,但我似乎无法找到寻找。 (我发现了很多有趣的讨论,但没有真正讨论我的问题。)
有没有办法从函数内部知道预期的 return 值的数量?
例如,可以有函数:
def lazyOdd():
return 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21
将使用 one, three, five = lazyOdd()
调用。
编辑:显然一点都不清楚,我寻找的是这样的:
def lazyReturn():
return (val1, val2) if expectedReturns == 2 else (val1, val2, val3, val4)
我知道在这种情况下,这绝对不是继续进行的最佳方式,几乎任何一种可迭代对象都可以,但是对于根本没有链接的值,它不会那么简单。如果可能的话,因为大多数用例将只使用两个结果,我想避免 returning 一个大元组,因为许多同事甚至不知道 return 其他人的功能值,它会很容易出错。
我能做到吗?
编辑: 另外,我不介意解决方案是否包含一些开销,因为我很可能会通过不处理最后三个值来赢得很多时间。
Edit²:也许最好的方法真的是传递另一个指定预期值数量的参数?
我不太明白你想做什么。函数返回的元组中元素的数量由函数决定,或者更具体地说,由编写函数的程序员决定。如果您的同事只对前两个元素感兴趣,他们可以这样做:
one, three, *_ = lazyOdd()
_ 是一个垃圾变量,用于存储元组的其余部分。
缓存
从你的描述中很难判断,但你似乎需要caching。
这样你就可以写多个函数了。一个用于繁重的计算,其他的输出正确的格式和值的数量。如果重计算以相同的输入值第二次调用,则返回之前的结果。
from functools import lru_cache
@lru_cache(maxsize=32)
def heavy_common_calculation(x):
print("HEAVY CALCULATION FOR %d. Should only be done once!" % x)
result = x**2
return result
def get_two_values(x):
return x, heavy_common_calculation(x)
def get_four_values(x):
y = heavy_common_calculation(x)
return x, y, y**2, y**3
print(get_two_values(3))
# HEAVY CALCULATION FOR 3. Should only be done once!
# (3, 9)
print(get_four_values(3))
# (3, 9, 81, 729)
发电机
你想实施 generator 吗?
def lazyOdd():
x = 1
while True:
yield x
x = x + 2
odd_gen = lazyOdd()
print(next(odd_gen))
# 1
print(next(odd_gen))
# 3
print(next(odd_gen))
# 5
print(next(odd_gen))
# 7
如果你想要一个值,它会被计算出来。如果你不需要它,什么都不会发生,什么都白算。
len(odd_gen)
未定义,因为它会启动无限循环。
关键字参数
您可以使用一个参数来告诉函数您需要多少个结果:
def f(x, detail='low'):
a, b = x, x**2
if detail == 'high':
return a, b, 'something', 'else'
else:
return a, b
print(f(3))
# (3, 9)
print(f(3, detail='high'))
# (3, 9, 'something', 'else')