website/content/blog/copydecorator.md

50 lines
892 B
Markdown
Raw Permalink Normal View History

2020-04-08 19:05:28 -04:00
---
title: "Quick Python: Copy Decorator"
date: 2020-04-08T18:49:54-04:00
draft: false
2022-01-02 14:24:29 -05:00
tags: ["Python"]
2023-01-05 14:04:45 -05:00
medium_enabled: true
2020-04-08 19:05:28 -04:00
---
If you want to guarantee that your function doesn't modify any of the references and don't mind paying a price in memory consumption, here is a decorator you can easily add to your functions.
```python
from copy import deepcopy
def copy_arguments(func):
def wrapper(*args, **kwargs):
new_args = deepcopy(args)
new_kwargs = deepcopy(kwargs)
return func(*new_args, **new_kwargs)
return wrapper
```
Example usage:
```python
@copy_arguments
def modify1(xs):
for i, _ in enumerate(xs):
xs[i] *= 2
```
Comparison:
```python
def modify2(xs):
for i, _ in enumerate(xs):
xs[i] *= 2
a = [1, 2, 3, 4, 5]
b = [1, 2, 3, 4, 5]
modify1(a)
modify2(a)
print(a)
print(b)
```
```
[1, 2, 3, 4, 5]
[2, 4, 6, 8, 10]
```