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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file typed_proxy-1.0.1.tar.gz.
File metadata
- Download URL: typed_proxy-1.0.1.tar.gz
- Upload date:
- Size: 4.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.1.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a22e1945974d7ea84dbf7f57ae55e9c55655ea1055eff6fecde04e648b834af3
|
|
| MD5 |
cbcca5e7f4004a8dcac97af21edf26fd
|
|
| BLAKE2b-256 |
bf15522130c35ba35174e97aaf9108db8b4d05803bb7584248ce1a71b189f4e2
|
File details
Details for the file typed_proxy-1.0.1-py3-none-any.whl.
File metadata
- Download URL: typed_proxy-1.0.1-py3-none-any.whl
- Upload date:
- Size: 5.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.1.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
369f4800cdd65e77db9386a1105a5ce823267e9cba5176fcb4e12d7571cdb92f
|
|
| MD5 |
9c44ae22fbd255a2c9a1edd90ae734ba
|
|
| BLAKE2b-256 |
491d58d1f9acd15d4fdd56727da844253d40ad660886f84ce7b7fe92f599004a
|