gpt4 book ai didi

python - 像 C++11 中那样分配给函数调用

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

在 C++ 中,允许返回对值的引用,然后写入 is,例如:

#include <iostream>

int main() {
int data[] = {1,2,3,4};
std::cout << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << '\n';
auto key =
[](int data[]) -> int &
{
return data[1];
};
key(data) = 6;
std::cout << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << '\n';
}

这有效,C++11 代码的输出是:

1 2 3 4
1 6 3 4

同时,在 Python 3 中:

data = (1,2,3,4)
key = lambda d: d[2]
key(data) = 5
print(data)

这可行,但不令人满意,因为它很好地表明我不能分配给函数调用:

  File "gett.py", line 4
key(data) = 5
^
SyntaxError: can't assign to function call

那么如何传递可用于获取和设置的可调用对象呢? Python 3 执行此操作的方法是什么?

我的特殊用例是我有这样的东西:

#Data = namedtuple('Data',    ['meta', 'value', 'othervalue'])
# since namedtuples are not muteable

class Data:
def __init__(self, meta, value, othervalue):
self.meta = meta; self.value=value; self.othervalue=othervalue;

data = [Data('blabla', None, 543), Data('blabla', 5, 54), Data('blabla', 324, None), Data('blabla', None, 34), Data('blabla', 432, None)]

我想要将每个 None 替换为 valueothervalue 的先前值,如下所示:

def nearest_before_interpolate(self, l, key):
last = 0
for i in range(len(l)):
with getattr(l[i], key) as val:
if val == None:
setattr(l[i], key, last)
else:
last = val

现在我将 key 作为字符串传递,但如果这是一个通用的 lambda ,它可以以任何它认为合适的方式提取正确的字段(并不是说它真的需要这种灵 active ),那就太好了,但我猜我比字符串更喜欢 lambda,而且也更适合这个用例)。

有人有好的建议吗?

最佳答案

这里有两个问题:

  • Python 语法不允许直接分配给函数调用的返回值 - 无法分配给函数调用。就这么简单。

  • 元组是不可变的,因此您无法替换项目,只能更改其值。这在您的简化示例中显然是一个问题 - 您无法更改数字的值。5 就是 5。

解决这些问题,这是一个概念证明:

data = ([1],[2],[3],[4])
key = lambda d: d[2]
v = key(data)
v.append(0)
print(data) # ([1], [2], [3, 0], [4])
<小时/>

更新:抱歉,我有点困惑,因为你使用了元组,然后使用了列表。

好吧,你几乎可以做到,只是不使用你想要的语法:

class wrapper():
def __init__(self, d, i):
self.d = d
self.i = i
def set(self, v):
self.d[self.i] = v

data = [1,2,3,4]
key = lambda d: wrapper(d, 2)
v = key(data)
v.set(5)
print(data) # [1, 2, 5, 4]

在Python中你不能重载赋值,所以你需要一些其他方法来改变值。这里我选择了一个函数调用,但是你可以使用任何可以是 intercepted 的东西。 (例如:设置属性)。

关于python - 像 C++11 中那样分配给函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30800823/

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