Reputation: 1475
I am trying to provide wrappers for short-cutting every-day commands. Python environments are very useful to do that.
Is it possible to provide all methods of an object to the local namespace within a new environment?
class my_object:
def method_a():
...
class my_environment:
...
def __enter__(self):
some_object = my_object()
# something like `from some_object import *` ??
return(some_object)
...
with my_environment() as some_object:
# standard syntax:
some_object.method_a()
# shortcut:
method_a() # how to make this possible?
Upvotes: 0
Views: 30
Reputation: 148880
It will be rather complex, and IMHO will not be worth it. The problem is that in Python, local variables are local to a function and not to a bloc. So what you are asking for would require that:
__enter__
declares nonlocal
variables for all of the methods from some_object
and saves their previous value if any__exit__
restore the previous values if any of those variables, or deletes them if they did not previously existedPossible but not really Pythonic IMHO (the reason why I have not proposed any code...). After all, inside a method Python requires the object to be explicitely passed, and requires it to be prepended to any internal method call or attribute access. So my advice is to stick to the standard syntax here...
Upvotes: 1
Reputation: 3
What you are looking for is class hierarchy. On the way, please be careful with the conventions for class names.
class MyObject:
def method_a():
...
class MyEnvironment(MyObject):
...
def __enter__(self):
return self
...
with MyEnvironment() as some_object:
# standard syntax:
some_object.method_a()
The shortcut you are looking doesn't make much sense because the method_a()
was defined as a method, therefore it should be called together with the instance.
Maybe @staticmethod can serve your case better.
class MyEnvironment:
@staticmethod
def method_a():
...
MyEnvironment.method_a()
Upvotes: 0