diff options
Diffstat (limited to 'modules/language/python/module')
-rw-r--r-- | modules/language/python/module/_python.scm | 6 | ||||
-rw-r--r-- | modules/language/python/module/enum.py | 17 | ||||
-rw-r--r-- | modules/language/python/module/os.scm | 12 | ||||
-rw-r--r-- | modules/language/python/module/socket.py | 23 |
4 files changed, 36 insertions, 22 deletions
diff --git a/modules/language/python/module/_python.scm b/modules/language/python/module/_python.scm index 531a6b5..6db3cf1 100644 --- a/modules/language/python/module/_python.scm +++ b/modules/language/python/module/_python.scm @@ -55,7 +55,11 @@ (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y))) -(define vars py-dict) +(define (vars x) + (for ((k v : x)) ((l '())) + (cons (cons k v) l) + #:final + (dict l))) (define (repr x) ((@ (guile) format) #f "~a" x)) (define abs py-abs) diff --git a/modules/language/python/module/enum.py b/modules/language/python/module/enum.py index 34e19b6..80b9499 100644 --- a/modules/language/python/module/enum.py +++ b/modules/language/python/module/enum.py @@ -17,7 +17,6 @@ __all__ = [ 'auto', 'unique', ] - def _is_descriptor(obj): """Returns True if obj is a descriptor, False otherwise.""" return ( @@ -532,11 +531,13 @@ class Enum(metaclass=EnumMeta): # all enum instances are actually created during class construction # without calling this method; this method is called by the metaclass' # __call__ (i.e. Color(3) ), and by pickle + if type(value) is cls: # For lookups like Color(Color.RED) return value # by-value search for a matching enum member # see if it's in the reverse mapping (for hashable values) + try: if value in cls._value2member_map_: return cls._value2member_map_[value] @@ -545,6 +546,7 @@ class Enum(metaclass=EnumMeta): for member in cls._member_map_.values(): if member._value_ == value: return member + # still not found -- try _missing_ hook return cls._missing_(value) @@ -626,6 +628,7 @@ class Enum(metaclass=EnumMeta): # also, replace the __reduce_ex__ method so unpickling works in # previous Python versions module_globals = vars(sys.modules[module]) + if source: source = vars(source) else: @@ -636,19 +639,24 @@ class Enum(metaclass=EnumMeta): # are multiple names for the same number rather than varying # between runs due to hash randomization of the module dictionary. members = [ - (name, source[name]) - for name in source.keys() - if filter(name)] + (name, source[name]) + for name in source.keys() + if filter(name)] try: # sort by value members.sort(key=lambda t: (t[1], t[0])) except TypeError: # unless some values aren't comparable, in which case sort by name members.sort(key=lambda t: t[0]) + cls = cls(name, members, module=module) + cls.__reduce_ex__ = _reduce_ex_by_name + module_globals.update(cls.__members__) + module_globals[name] = cls + return cls @@ -887,3 +895,4 @@ def _power_of_two(value): if value < 1: return False return value == 2 ** _high_bit(value) + diff --git a/modules/language/python/module/os.scm b/modules/language/python/module/os.scm index d593b58..dab8dda 100644 --- a/modules/language/python/module/os.scm +++ b/modules/language/python/module/os.scm @@ -2355,8 +2355,10 @@ (define path "posixpath") (define (_get_exports_list mod) - (let ((p (rawref mod '_private))) - (rawset mod '_private #f) - (let ((l (dir mod))) - (rawset mod '_private p) - l))) + (let ((p (rawref mod '_export)) + (l '())) + (module-for-each + (lambda (k v) + (set! l (cons (symbol->string k) l))) + p) + (py-list l))) diff --git a/modules/language/python/module/socket.py b/modules/language/python/module/socket.py index 31b814a..cb70bc8 100644 --- a/modules/language/python/module/socket.py +++ b/modules/language/python/module/socket.py @@ -47,33 +47,32 @@ Integer constants: Many other constants may be defined; these may be used in calls to the setsockopt() and getsockopt() methods. """ -pk(0,1) + import _socket from _socket import * -pk(0,2) import os, sys, io, selectors from enum import IntEnum, IntFlag -pk(0,3) + try: import errno except ImportError: errno = None -pk(0,4) + EBADF = getattr(errno, 'EBADF', 9) EAGAIN = getattr(errno, 'EAGAIN', 11) EWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', 11) -pk(0,5) + __all__ = ["fromfd", "getfqdn", "create_connection", "AddressFamily", "SocketKind"] __all__.extend(os._get_exports_list(_socket)) -pk(0,6) + # Set up the socket.AF_* socket.SOCK_* constants as members of IntEnums for # nicer string representations. # Note that _socket only knows about the integer values. The public interface # in this module understands the enums and translates them back from integers # where needed (e.g. .family property of a socket object). name__ = '_socket' -pk(1) + IntEnum._convert( 'AddressFamily', name__, @@ -92,7 +91,7 @@ IntFlag._convert( 'AddressInfo', name__, lambda C: C.isupper() and C.startswith('AI_')) -pk(2) + _LOCALHOST = '127.0.0.1' _LOCALHOST_V6 = '::1' @@ -462,7 +461,7 @@ def fromfd(fd, family, type, proto=0): """ nfd = dup(fd) return socket(family, type, proto, nfd) -pk(3) + if hasattr(_socket.socket, "share"): def fromshare(info): """ fromshare(info) -> socket object @@ -472,7 +471,7 @@ if hasattr(_socket.socket, "share"): """ return socket(0, 0, 0, info) __all__.append("fromshare") -pk(4) + if hasattr(_socket, "socketpair"): def socketpair(family=None, type=SOCK_STREAM, proto=0): @@ -533,7 +532,7 @@ else: lsock.close() return (ssock, csock) __all__.append("socketpair") -pk(5) + socketpair.__doc__ = """socketpair([family[, type[, proto]]]) -> (socket object, socket object) Create a pair of socket objects from the sockets returned by the platform socketpair() function. @@ -751,4 +750,4 @@ def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0): _intenum_converter(socktype, SocketKind), proto, canonname, sa)) return addrlist -pk(6) + |