File tree Expand file tree Collapse file tree 3 files changed +64
-0
lines changed
Expand file tree Collapse file tree 3 files changed +64
-0
lines changed Original file line number Diff line number Diff 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
185186Name = 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
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff 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+
147170def nameof (* args ):
148171 """Get the names of the variables passed in
149172
You can’t perform that action at this time.
0 commit comments