A Python package that provides a metaclass for creating proxy classes with type annotations.
Project description
typed-proxy
A Python package that provides a metaclass for creating proxy classes with type annotations.
Help
See documentation for more details
Install
To install typed-proxy, simply use pip:
$ pip install typed-proxy
Examples
Basic Usage
You can simply create a proxy class using the Proxy
metaclass. The following example shows how to define a class Bar
that proxies the class Foo
.
from proxy import Proxy
class Foo:
def __init__(self, a: int, b: int) -> None:
self.a = a
self.b = b
def f1(self) -> None:
print(f"Foo(a={self.a}, b={self.b}).f1()")
def f2(self) -> None:
print(f"Foo(a={self.a}, b={self.b}).f2()")
def f3(self) -> None:
print(f"Foo(a={self.a}, b={self.b}).f3()")
class Bar(Foo, metaclass=Proxy):
def f2(self) -> None:
print(f"Bar(a={self.a}, b={self.b}).f2()")
bar = Bar.proxy(Foo(1, 2))
bar.f1() # Foo(a=1, b=2).f1()
bar.f2() # Bar(a=1, b=2).f2()
bar.f3() # Foo(a=1, b=2).f3()
Accessing the Proxied Object
You can access the proxied object via the __proxied__
attribute in the proxy class.
class Bar(Foo, metaclass=Proxy):
def f2(self) -> None:
print(f"Bar(a={self.a}, b={self.b}).f2()")
self.__proxied__.f2()
bar = Bar.proxy(Foo(1, 2))
bar.f1() # Foo(a=1, b=2).f1()
bar.f2() # Bar(a=1, b=2).f2() / Foo(a=1, b=2).f2()
bar.f3() # Foo(a=1, b=2).f3()
Explicitly Defining __proxied__
Since type checkers cannot statically resolve __proxied__
, they might raise an issue such as error: "Bar" has no attribute "__proxied__"
.
To resolve this, you can explicitly define the __proxied__
attribute as follows.
class Bar(Foo, metaclass=Proxy):
__proxied__: Foo
def f2(self) -> None:
print(f"Bar(a={self.a}, b={self.b}).f2()")
self.__proxied__.f2()
bar = Bar.proxy(Foo(1, 2))
bar.f1() # Foo(a=1, b=2).f1()
bar.f2() # Bar(a=1, b=2).f2() / Foo(a=1, b=2).f2()
bar.f3() # Foo(a=1, b=2).f3()
Custom __init__()
for Proxy Class
You can define a custom __init__()
method in the proxy class and provide arguments using the proxy()
method with *args
and **kwargs
.
class Bar(Foo, metaclass=Proxy):
def __init__(self, a: int, b: int, c: int):
self.b = a
self.c = b
self.d = c
def f3(self) -> None:
print(f"Bar(a={self.a}, b={self.b}, c={self.c}, d={self.d}).f3()")
bar = Bar.proxy(Foo(1, 2), 3, 4, 5)
bar.f1() # Foo(a=1, b=2).f1()
bar.f2() # Foo(a=1, b=2).f2()
bar.f3() # Bar(a=1, b=3, c=4, d=5).f3()
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
Built Distribution
Hashes for typed_proxy-1.0.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 369f4800cdd65e77db9386a1105a5ce823267e9cba5176fcb4e12d7571cdb92f |
|
MD5 | 9c44ae22fbd255a2c9a1edd90ae734ba |
|
BLAKE2b-256 | 491d58d1f9acd15d4fdd56727da844253d40ad660886f84ce7b7fe92f599004a |