Skip to main content

A Python package that provides a metaclass for creating proxy classes with type annotations.

Project description

typed-proxy

Build status

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

typed_proxy-1.0.1.tar.gz (4.9 kB view details)

Uploaded Source

Built Distribution

typed_proxy-1.0.1-py3-none-any.whl (5.1 kB view details)

Uploaded Python 3

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

Hashes for typed_proxy-1.0.1.tar.gz
Algorithm Hash digest
SHA256 a22e1945974d7ea84dbf7f57ae55e9c55655ea1055eff6fecde04e648b834af3
MD5 cbcca5e7f4004a8dcac97af21edf26fd
BLAKE2b-256 bf15522130c35ba35174e97aaf9108db8b4d05803bb7584248ce1a71b189f4e2

See more details on using hashes here.

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

Hashes for typed_proxy-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 369f4800cdd65e77db9386a1105a5ce823267e9cba5176fcb4e12d7571cdb92f
MD5 9c44ae22fbd255a2c9a1edd90ae734ba
BLAKE2b-256 491d58d1f9acd15d4fdd56727da844253d40ad660886f84ce7b7fe92f599004a

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page