How do I create a constant in Python?

后端 未结 30 3196
既然无缘
既然无缘 2020-11-22 09:07

Is there a way to declare a constant in Python? In Java we can create constant values in this manner:

public static          


        
30条回答
  •  甜味超标
    2020-11-22 09:33

    In my case, I needed immutable bytearrays for an implementation of a crypto library containing many literal numbers I wanted to ensure were constant.

    This answer works but attempted reassignment of bytearray elements does not raise an error.

    def const(func):
        '''implement const decorator'''
        def fset(self, val):
            '''attempting to set a const raises `ConstError`'''
            class ConstError(TypeError):
                '''special exception for const reassignment'''
                pass
    
            raise ConstError
    
        def fget(self):
            '''get a const'''
            return func()
    
        return property(fget, fset)
    
    
    class Consts(object):
        '''contain all constants'''
    
        @const
        def C1():
            '''reassignment to C1 fails silently'''
            return bytearray.fromhex('deadbeef')
    
        @const
        def pi():
            '''is immutable'''
            return 3.141592653589793
    

    Constants are immutable, but constant bytearray assignment fails silently:

    >>> c = Consts()
    >>> c.pi = 6.283185307179586  # (https://en.wikipedia.org/wiki/Tau_(2%CF%80))
    Traceback (most recent call last):
      File "", line 1, in 
      File "consts.py", line 9, in fset
        raise ConstError
    __main__.ConstError
    >>> c.C1[0] = 0
    >>> c.C1[0]
    222
    >>> c.C1
    bytearray(b'\xde\xad\xbe\xef')
    

    A more powerful, simple, and perhaps even more 'pythonic' approach involves the use of memoryview objects (buffer objects in <= python-2.6).

    import sys
    
    PY_VER = sys.version.split()[0].split('.')
    
    if int(PY_VER[0]) == 2:
        if int(PY_VER[1]) < 6:
            raise NotImplementedError
        elif int(PY_VER[1]) == 6:
            memoryview = buffer
    
    class ConstArray(object):
        '''represent a constant bytearray'''
        def __init__(self, init):
            '''
            create a hidden bytearray and expose a memoryview of that bytearray for
            read-only use
            '''
            if int(PY_VER[1]) == 6:
                self.__array = bytearray(init.decode('hex'))
            else:
                self.__array = bytearray.fromhex(init)
    
            self.array = memoryview(self.__array)
    
        def __str__(self):
            return str(self.__array)
    
        def __getitem__(self, *args, **kwargs):
           return self.array.__getitem__(*args, **kwargs)
    

    ConstArray item assignment is a TypeError:

    >>> C1 = ConstArray('deadbeef')
    >>> C1[0] = 0
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: 'ConstArray' object does not support item assignment
    >>> C1[0]
    222
    

提交回复
热议问题