我现在有许多函数,都是这样定义的:
def func1(context):
context_ = copy(context)
# do something
context_.xxx = xxxx
return context_
因为我不想因为副作用修改传入的参数,所以函数的首行,都 copy 了一下。 觉得这样有些重复,有没有什么方法,比如装饰器,或者 context manager,省去每次显式 copy 的做法?
ps: 我是有许多这样的函数,想创建一个 pipeline,为了简单就入参和出参一样了
1
tempdban 2018-05-23 08:26:01 +08:00 via Android
不清楚 copy 是否有用,但是 copy.deepcopy 一定不会错。
装饰器搞得定。 |
2
iwishing 2018-05-23 08:32:05 +08:00
在调用前复制一下入参不行么?所有的函数调用都不想改入参?需要改入参的情况才是常态吧?
|
3
chaleaochexist 2018-05-23 08:33:26 +08:00
装饰器的典型应用场景...
面向切面了解一下. |
4
lieh222 2018-05-23 08:36:13 +08:00
避免函数的副作用的正确方法就是不写函数,不写函数就不用传参,不传参就不用担心副作用,不写函数就不用调用,像写作文一样去写
|
7
clino 2018-05-23 09:33:40 +08:00
为什么不写类来表达上下文?
一个对象内部的数据就可以作为上下文 |
8
clino 2018-05-23 09:34:49 +08:00
哦,楼主的重点是每次要复制一份新的上下文来用哈
|
9
lolizeppelin 2018-05-23 09:46:06 +08:00
写一个专门的复制函数复制你的 context
用装饰器加复制函数实现预复制功能 |
11
jmc891205 2018-05-23 11:33:18 +08:00
每个函数开头都 copy 一下?浪费了 memory 又拖慢了 performance
|
12
enenaaa 2018-05-23 12:09:33 +08:00
封装好 context, 只给特定的代码修改权限呗
|
13
lululau 2018-05-23 12:16:57 +08:00 via iPhone
因噎废食,熟练掌握语言,知道哪些操作会修改对象哪些不对,在纯函数里不在参数上调用那些会修改对象的函数 /方法就可以了
|
14
quinoa42 2018-05-24 07:43:07 +08:00
我觉得你需要的是实现 immutable object,而不是手动 copy
|
16
jennifertxwoodma 2018-06-07 18:06:49 +08:00 1
|