Replace a function's default values with objects unique to each function call
Project description
unique_defaults
Guarantee new objects are used for each function call.
This allows writing signatures with mutable defaults without sharing the underlying object between function calls.
from unique_defaults import unique_lists
def classic(a=[]):
a.append("again")
return " ".join(a)
classic() == "again"
classic() == "again again"
@unique_lists
def unique(a=[]):
a.append("again")
return " ".join(a)
unique() == "again"
unique() == "again"
Using the mutable object directly in the function signature leads to shorter and more accurate annotations, as well as simplifying the function's logic.
from typing import List, Optional
from unique_defaults import unique_lists
def classic(a: Optional[List] = None):
if a is None:
a = []
a.append("again")
return " ".join(a)
classic() == "again"
classic() == "again"
@unique_lists
def unique(a: List = []):
a.append("again")
return " ".join(a)
unique() == "again"
unique() == "again"
Individual arguments can be targeted, instead of a general type.
from unique_defaults import unique_defaults
@unique_defaults('line_list')
def log_list(line_list=[], _running_log=[]):
line_list[:0] = ["NOTICE:"]
line = " ".join(line_list)
_running_log.append(line)
return _running_log
log_list(["first"]) == ["NOTICE: first"]
log_list(["second"]) == ["NOTICE: first", "NOTICE: second"]
Any types can be made unique
from unique_defaults import unique_defaults
class Count:
def __init__(self):
self.count = 0
def add(self, n):
self.count += n
def classic(a=Count()):
a.add(1)
return a
classic().count == 1
classic().count == 2
@unique_defaults(Count)
def unique(a=Count()):
a.add(1)
return a
unique().count == 1
unique().count == 1
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
unique_defaults-1.0.tar.gz
(4.6 kB
view details)
Built Distribution
File details
Details for the file unique_defaults-1.0.tar.gz
.
File metadata
- Download URL: unique_defaults-1.0.tar.gz
- Upload date:
- Size: 4.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.27.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1614fa1fbd53b8a52aef201d55524aa25e701d5c289d9ed5a9dfaaa7c68354b1 |
|
MD5 | 7f08aa4091e9ba961142e8f2c9808f6f |
|
BLAKE2b-256 | f6ee6ed229ff3c595b434e1c83eeb031e9d8014df38028aa040382800a4910dc |
File details
Details for the file unique_defaults-1.0-py2.py3-none-any.whl
.
File metadata
- Download URL: unique_defaults-1.0-py2.py3-none-any.whl
- Upload date:
- Size: 3.5 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.27.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 72deacff135e375b7efea7243d7743766ab066ca0c45d0e561eca76a56afae9a |
|
MD5 | 1bd509e900c5f394ba3af0086d015778 |
|
BLAKE2b-256 | ef0a6914bee0436dd90be9ab673c402d51eefd1b3cba272fa216d8482e521b43 |