2

I am using gmpy2 to work with high-precision floats (>500 bit of precision). My code contains long lists of such floats, e.g.

import gmpy2

gmpy2.get_context().precision = 500
rs = gmpy2.random_state()
lst = [gmpy2.mpfr_random(rs) for _ in range(4)]
print(lst)

# [mpfr('0.271521109675768030046267124634073667684105281814578550174956682310741033886748
#  70742194330013240808110139077875599032334632394117927746462940740105086152',500), mpfr('0.651
#  70987608257463499855942595039172347625432569368637954337608487459435530015416379355871
#  784576133166076679114013337947978739119046252118327755675301311',500), mpfr('0.250491752647
#  45810463315271935029178260478893809777157454094624870772157985848539893902700198
#  946816912841670920043748676653996297679708199369887486126487',500), mpfr('0.35225 ...

As you see in this example, output tends to be unreadable because mpfr.__repr__ prints all digits to the screen. I know in this example I could simply format the output

print([f'{l}' for l in lst])
# ['0.271521', '0.651710', '0.250492', '0.352256']

However, I also have classes that internally contain mpfrs, and it'd be convenient that the automatically generated representations look more compact, for instance with only 10 digits.

I tried overwriting the __repr__ method, but the naive attempt fails:

BigFloat = gmpy2.mpfr
BigFloat.__repr__ = lambda self: 'bigfloat'

# TypeError: cannot set '__repr__' attribute of immutable type 'mpfr'

I also tried creating a new class that inherits from mpfr, but that also does not work

class BigFloat(gmpy2.mpfr):

    def __repr__(self):
        return 'bigfloat'

# TypeError: type 'mpfr' is not an acceptable base type

I know I could create a new class BigFloat that internally contains a gmpy2.mpfr. Then I would reimplement all magic methods like __add__, __neg__, ... based on the mpfr class. But is there a more concise/elegant solution?

3
  • Using __getattr__ would be more concise at least. Commented Nov 7, 2023 at 16:21
  • Do the answers to this question about a proxy object help at all? You could have a proxy which forwarded all methods except __repr__(). Commented Nov 7, 2023 at 16:41
  • 1
    Btw if your goal is a readable print of the numbers, you would usually overwrite __str__, not __repr__. The latter is meant to produce a string representation that is as exact as possible, so it makes sense to print all digits there. Commented Nov 7, 2023 at 22:05

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.