
我现在有许多函数,都是这样定义的:
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 装饰器的典型应用场景... 面向切面了解一下. |
避免函数的副作用的正确方法就是不写函数,不写函数就不用传参,不传参就不用担心副作用,不写函数就不用调用,像写作文一样去写 |
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 |