How do I create a constant in Python?

后端 未结 30 3029
既然无缘
既然无缘 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:28

    Here is an implementation of a "Constants" class, which creates instances with read-only (constant) attributes. E.g. can use Nums.PI to get a value that has been initialized as 3.14159, and Nums.PI = 22 raises an exception.

    # ---------- Constants.py ----------
    class Constants(object):
        """
        Create objects with read-only (constant) attributes.
        Example:
            Nums = Constants(ONE=1, PI=3.14159, DefaultWidth=100.0)
            print 10 + Nums.PI
            print '----- Following line is deliberate ValueError -----'
            Nums.PI = 22
        """
    
        def __init__(self, *args, **kwargs):
            self._d = dict(*args, **kwargs)
    
        def __iter__(self):
            return iter(self._d)
    
        def __len__(self):
            return len(self._d)
    
        # NOTE: This is only called if self lacks the attribute.
        # So it does not interfere with get of 'self._d', etc.
        def __getattr__(self, name):
            return self._d[name]
    
        # ASSUMES '_..' attribute is OK to set. Need this to initialize 'self._d', etc.
        #If use as keys, they won't be constant.
        def __setattr__(self, name, value):
            if (name[0] == '_'):
                super(Constants, self).__setattr__(name, value)
            else:
                raise ValueError("setattr while locked", self)
    
    if (__name__ == "__main__"):
        # Usage example.
        Nums = Constants(ONE=1, PI=3.14159, DefaultWidth=100.0)
        print 10 + Nums.PI
        print '----- Following line is deliberate ValueError -----'
        Nums.PI = 22
    

    Thanks to @MikeGraham 's FrozenDict, which I used as a starting point. Changed, so instead of Nums['ONE'] the usage syntax is Nums.ONE.

    And thanks to @Raufio's answer, for idea to override __ setattr __.

    Or for an implementation with more functionality, see @Hans_meine 's named_constants at GitHub

提交回复
热议问题