Skip to content

Commit 369ae9c

Browse files
committed
Add inject function
1 parent f415a86 commit 369ae9c

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

README.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ pip install python-varname
1616
- A value wrapper to store the variable name that a value is assigned to (added in `v0.1.1`)
1717
- Detecting next immediate attribute name (added in `v0.1.4`)
1818
- Shortcut for `collections.namedtuple` (added in `v0.1.6`)
19+
- Injecting `__varname__` to objects (added in `v0.1.7`)
1920

2021
## Usage
2122

@@ -185,6 +186,28 @@ from varname import namedtuple
185186
Name = namedtuple(['first', 'last'])
186187
```
187188

189+
### Injecting `__varname__`
190+
191+
```python
192+
from varname import inject
193+
194+
class MyList(list):
195+
pass
196+
197+
a = inject(MyList())
198+
b = inject(MyList())
199+
200+
a.__varname__ == 'a'
201+
b.__varname__ == 'b'
202+
203+
a == b
204+
205+
# other methods not affected
206+
a.append(1)
207+
b.append(1)
208+
a == b
209+
```
210+
188211
## Limitations
189212
- Working in `ipython REPL` but not in standard `python console`
190213
- You have to know at which stack the function/class will be called

tests/test_varname.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
VarnameRetrievingError,
66
Wrapper,
77
will,
8+
inject,
89
namedtuple,
910
_get_executing,
1011
nameof)
@@ -365,3 +366,20 @@ def test_namedtuple():
365366
Name = namedtuple(['first', 'last'])
366367
name = Name('Bill', 'Gates')
367368
assert isinstance(name, Name)
369+
370+
def test_inject():
371+
372+
with pytest.raises(VarnameRetrievingError):
373+
a = inject(1)
374+
375+
class A(list):
376+
pass
377+
378+
a = inject(A())
379+
b = inject(A())
380+
assert a.__varname__ == 'a'
381+
assert b.__varname__ == 'b'
382+
assert a == b
383+
a.append(1)
384+
b.append(1)
385+
assert a == b

varname.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,29 @@ def i_will():
144144

145145
return ret
146146

147+
def inject(obj):
148+
"""Inject attribute `__varname__` to an object
149+
150+
Args:
151+
obj: An object that can be injected
152+
153+
Warns:
154+
VarnameRetrievingWarning: When `__varname__` already exists
155+
156+
Raises:
157+
VarnameRetrievingError: When `__varname__` is unable to
158+
be set as an attribute
159+
160+
Returns:
161+
obj: The object with __varname__ injected
162+
"""
163+
vname = varname()
164+
try:
165+
setattr(obj, '__varname__', vname)
166+
except AttributeError:
167+
raise VarnameRetrievingError('Unable to inject __varname__.')
168+
return obj
169+
147170
def nameof(*args):
148171
"""Get the names of the variables passed in
149172

0 commit comments

Comments
 (0)