Question about math.pi is mutable

Thomas 'PointedEars' Lahn PointedEars at web.de
Fri Nov 6 18:48:40 EST 2015


Thomas 'PointedEars' Lahn wrote:

> In theory, it should be possible to substitute “math” with a reference to
> an object that acts as a proxy for the original “math” module object but
> whose base class declares the attributes for all the constants read-only.

#!/usr/bin/env python3
#---------------------------------------------------------------------------

import importlib

class MyMath(object):
    def getter_factory (prop):
        def getter (self):
            return getattr(importlib.__import__("math", globals(), locals(),
                        [prop], 0), prop)
        return getter

    pi = property(getter_factory("pi"), lambda self, val: None,
            lambda self: None)
    e = property(getter_factory("e"), lambda self, val: None,
            lambda self: None)
    inf = property(getter_factory("inf"), lambda self, val: None,
            lambda self: None)
    nan = property(getter_factory("nan"), lambda self, val: None,
            lambda self: None)

    def __getattr__ (self, name):
        return getattr(importlib.__import__("math", globals(), locals(),
                    [name], 0), name, None)

math = MyMath()

print(math.pi, math.e, math.inf, math.nan)

math.pi = 42
math.e = 42
math.inf = 42
math.nan = 42

print(math.pi, math.e, math.inf, math.nan)
print(math.ceil(2.41))
#---------------------------------------------------------------------------

Using property() instead of decorators here was intended to achieve DRY by 
using a loop, but I could not find a way to define class attributes 
dynamically.  Suggestions?

-- 
PointedEars

Twitter: @PointedEars2
Please do not cc me. / Bitte keine Kopien per E-Mail.



More information about the Python-list mailing list