X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/c567f805f46359a56f7f5ebbf51b68a4ab275461..b2e2c7eef3e99fc9ad23e1b69020ff0fc722ba61:/catacomb/__init__.py diff --git a/catacomb/__init__.py b/catacomb/__init__.py index 94efb6f..0e5c31c 100644 --- a/catacomb/__init__.py +++ b/catacomb/__init__.py @@ -55,7 +55,8 @@ if _dlflags >= 0: else: pass # can't do this. _sys.setdlopenflags(_dlflags) -import _base +if _sys.version_info >= (3,): from . import _base +else: import _base if _odlflags >= 0: _sys.setdlopenflags(_odlflags) @@ -78,11 +79,23 @@ def default_lostexchook(why, ty, val, tb): lostexchook = default_lostexchook ## Text/binary conversions. -def _bin(s): return s +if _sys.version_info >= (3,): + def _bin(s): return s.encode('iso8859-1') +else: + def _bin(s): return s ## Iterating over dictionaries. -def _iteritems(dict): return dict.iteritems() -def _itervalues(dict): return dict.itervalues() +if _sys.version_info >= (3,): + def _iteritems(dict): return dict.items() + def _itervalues(dict): return dict.values() +else: + def _iteritems(dict): return dict.iteritems() + def _itervalues(dict): return dict.itervalues() + +## The built-in bignum type. +try: long +except NameError: _long = int +else: _long = long ## How to fix a name back into the right identifier. Alas, the rules are not ## consistent. @@ -174,14 +187,32 @@ def _pp_dict(pp, items): _pp_commas(pp, p, items) ###-------------------------------------------------------------------------- +### Mappings. + +if _sys.version_info >= (3,): + class _tmp: + def __str__(me): return '%s(%r)' % (type(me).__name__, list(me)) + __repr__ = __str__ + def _repr_pretty_(me, pp, cyclep): + ind = _pp_bgroup_tyname(pp, me, '([') + _pp_commas(pp, pp.pretty, me) + pp.end_group(ind, '])') + _augment(_base._KeyView, _tmp) + _augment(_base._ValueView, _tmp) + _augment(_base._ItemView, _tmp) + +###-------------------------------------------------------------------------- ### Bytestrings. class _tmp: def fromhex(x): return ByteString(_unhexify(x)) fromhex = staticmethod(fromhex) - def hex(me): return _hexify(me) - __hex__ = hex + if _sys.version_info >= (3,): + def hex(me): return _hexify(me).decode() + else: + def hex(me): return _hexify(me) + __hex__ = hex def __repr__(me): return 'bytes(%r)' % me.hex() _augment(ByteString, _tmp) @@ -385,8 +416,9 @@ class BaseRat (object): def __rtruediv__(me, you): n, d = _split_rat(you) return type(me)(me._d*n, me._n*d) - __div__ = __truediv__ - __rdiv__ = __rtruediv__ + if _sys.version_info < (3,): + __div__ = __truediv__ + __rdiv__ = __rtruediv__ def _order(me, you, op): n, d = _split_rat(you) return op(me._n*d, n*me._d) @@ -399,6 +431,10 @@ class BaseRat (object): class IntRat (BaseRat): RING = MP + def __new__(cls, a, b): + if isinstance(a, float) or isinstance(b, float): return a/b + return super(IntRat, cls).__new__(cls, a, b) + def __float__(me): return float(me._n)/float(me._d) class GFRat (BaseRat): RING = GF @@ -412,10 +448,15 @@ class _tmp: def mont(x): return MPMont(x) def barrett(x): return MPBarrett(x) def reduce(x): return MPReduce(x) - def __truediv__(me, you): return IntRat(me, you) - def __rtruediv__(me, you): return IntRat(you, me) - __div__ = __truediv__ - __rdiv__ = __rtruediv__ + def __truediv__(me, you): + if isinstance(you, float): return _long(me)/you + else: return IntRat(me, you) + def __rtruediv__(me, you): + if isinstance(you, float): return you/_long(me) + else: return IntRat(you, me) + if _sys.version_info < (3,): + __div__ = __truediv__ + __rdiv__ = __rtruediv__ _repr_pretty_ = _pp_str _augment(MP, _tmp) @@ -428,8 +469,9 @@ class _tmp: def quadsolve(x, y): return x.reduce().quadsolve(y) def __truediv__(me, you): return GFRat(me, you) def __rtruediv__(me, you): return GFRat(you, me) - __div__ = __truediv__ - __rdiv__ = __rtruediv__ + if _sys.version_info < (3,): + __div__ = __truediv__ + __rdiv__ = __rtruediv__ _repr_pretty_ = _pp_str _augment(GF, _tmp) @@ -449,7 +491,7 @@ class _tmp: _augment(Field, _tmp) class _tmp: - def __repr__(me): return '%s(%sL)' % (_clsname(me), me.p) + def __repr__(me): return '%s(%s)' % (_clsname(me), me.p) def __hash__(me): return 0x114401de ^ hash(me.p) def _repr_pretty_(me, pp, cyclep): ind = _pp_bgroup_tyname(pp, me) @@ -460,7 +502,7 @@ class _tmp: _augment(PrimeField, _tmp) class _tmp: - def __repr__(me): return '%s(%#xL)' % (_clsname(me), me.p) + def __repr__(me): return '%s(%#x)' % (_clsname(me), me.p) def ec(me, a, b): return ECBinProjCurve(me, a, b) def _repr_pretty_(me, pp, cyclep): ind = _pp_bgroup_tyname(pp, me)