From 70e3ba150960fdbd46c69e00ef6f7437f99966c8 Mon Sep 17 00:00:00 2001 From: Stefan Israelsson Tampe Date: Wed, 18 Apr 2018 14:58:45 +0200 Subject: small steps --- modules/language/python/dict.scm | 2 +- modules/language/python/hash.scm | 2 +- modules/language/python/module.scm | 38 +++++++++++++++++++++------------- modules/language/python/module/enum.py | 4 ++-- 4 files changed, 28 insertions(+), 18 deletions(-) (limited to 'modules/language/python') diff --git a/modules/language/python/dict.scm b/modules/language/python/dict.scm index 977d5e1..f76e2ad 100644 --- a/modules/language/python/dict.scm +++ b/modules/language/python/dict.scm @@ -13,7 +13,7 @@ #:use-module (oop goops) #:use-module (oop pf-objects) #:export (make-py-hashtable - py-copy py-fromkeys py-get py-has_key py-items py-iteritems + py-copy py-fromkeys py-has_key py-items py-iteritems py-iterkeys py-itervalues py-keys py-values py-popitem py-setdefault py-update py-clear py-hash-ref dict pyhash-listing diff --git a/modules/language/python/hash.scm b/modules/language/python/hash.scm index 4fab02d..168cd44 100644 --- a/modules/language/python/hash.scm +++ b/modules/language/python/hash.scm @@ -42,7 +42,7 @@ s)))) (define-method (py-hash (x

)) - (aif it (pk 'it (ref x '__hash__)) + (aif it (ref x '__hash__) (pk 'hash (it)) (next-method))) diff --git a/modules/language/python/module.scm b/modules/language/python/module.scm index ab963d1..5c5d630 100644 --- a/modules/language/python/module.scm +++ b/modules/language/python/module.scm @@ -7,6 +7,7 @@ #:use-module (language python yield) #:use-module (language python try) #:use-module (language python dir) + #:use-module (language python list) #:export (Module private public import)) (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y))) @@ -121,7 +122,6 @@ (rawset self '_private #f) (if (not (rawref self '_module)) (begin - (set self '__dict__ self) (set self '__name__ (string-join (map symbol->string (reverse nm)) ".")) (let* ((_module (in-scheme (resolve-module (reverse l)))) @@ -135,20 +135,18 @@ (set self '_module _module) (hash-set! _modules l self)))))) - (define __getattribute__ + (define __getattr__ (lambda (self k) (define (fail) - (raise (KeyError "getattr in Module"))) - (aif it (rawref self k) - it - (if (rawref self '_module) - (let ((k (_k k)) - (m (_m self))) - (let ((x (module-ref m k e))) - (if (eq? e x) - (fail) - x))) - (fail))))) + (raise (AttributeError "getattr in Module"))) + (if (rawref self '_module) + (let ((k (_k k)) + (m (_m self))) + (let ((x (module-ref m k e))) + (if (eq? e x) + (fail) + x))) + (fail)))) (define __setattr__ (lambda (self k v) @@ -175,13 +173,25 @@ (raise KeyError "delattr of missing key in Module"))) (fail)))) + (define __dir__ + (lambda (self) + (let* ((h (slot-ref self 'h)) + (l '()) + (add (lambda (k . u) (set! l (cons (symbol->string k) l))))) + (hash-for-each add h) + (aif it (ref self '_module) + (module-for-each add it) + #f) + (py-list l)))) + + (define __repr__ (lambda (self) (format #f "Module(~a)" (ref self '__name__)))) (define __getitem__ (lambda (self k) (define k (if (string? k) (string->symbol k) k)) - (__getattribute__ self k))) + (__getattr__ self k))) (define __iter__ (lambda (self) diff --git a/modules/language/python/module/enum.py b/modules/language/python/module/enum.py index 7e7e46c..eefc1b5 100644 --- a/modules/language/python/module/enum.py +++ b/modules/language/python/module/enum.py @@ -150,7 +150,7 @@ class EnumMeta(type): if invalid_names: raise ValueError('Invalid enum member name: {0}'.format( ','.join(invalid_names))) - + # create a default docstring if one has not been provided if '__doc__' not in classdict: classdict['__doc__'] = 'An enumeration.' @@ -164,7 +164,7 @@ class EnumMeta(type): # save attributes from super classes so we know if we can take # the shortcut of storing members in the class dict - + base_attributes = {a for b in enum_class.mro() for a in b.__dict__} # Reverse value->name map for hashable values. -- cgit v1.2.3