Skip to content

pyhacks/consts-everywhere

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 

Repository files navigation

consts-everywhere

Create const variables everywhere. This is not just a __setattr__ trick that only makes it possible to create const members. You can also create local and global consts.

Installation

pip install consts-everywhere

How To Use

We have a proxy class:

class Const(wrapped)

This class inherits a variant of ObjectProxy from wrapt. Along with all augmented assignment operators, this class also overloads the normal assignment operator (=) thanks to assign-overload. wrapped can be any object and the resulting instance of this class will act like wrapped in every way. If you use this class, you need to call consts_everywhere.patch_and_reload_module(). consts_everywhere monkeypatches assign_overload.patch_and_reload_module() to make it possible to define global Const objects. Since it is monkeypatched you can also access this function from assign_overload module. You can find documentation about this function in assign-overload. Usage example:

import consts_everywhere

def main():
    a = consts_everywhere.Const(10)
    print(a) # prints 10
    a = 20 # Error

if consts_everywhere.patch_and_reload_module():
    main()

One thing to note is if you assign a variable holding a Const instance to a new variable, new variable takes the value of the Const instance, not the value of its underlying object. However, most operators return the underlying object. Example:

import consts_everywhere

def main():
    a = consts_everywhere.Const(10)
    print(type(a+5)) # prints int
    b = a
    print(type(b)) # prints Const

if consts_everywhere.patch_and_reload_module():
    main()

If you want to access the underlying object, use the __wrapped__ attribute:

import consts_everywhere

def main():
    a = consts_everywhere.Const(10)
    b = a.__wrapped__
    print(type(b)) # prints int

if consts_everywhere.patch_and_reload_module():
    main()

Const is also compatible with typeguard. Function argument type enforcement example:

import typeguard
import consts_everywhere

@typeguard.typechecked
def test4(a: consts_everywhere.Const[int]):
    pass

def main():
    a = consts_everywhere.Const(10)
    b = consts_everywhere.Const("abc")
    test4(a) # Ok
    test4(b) # Error

if consts_everywhere.patch_and_reload_module():
    main()

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors