On Thu, Feb 17, 2005 at 07:32:55PM +0000, Grant Edwards wrote:
I'd usually put big fat warnings around this code, and explain exaclty why I need to do things this way...
As a low-tech alternative, what about sourcecode generation, since you are targetting a python module? This gives two advantages vs the wrapping function: 1) the magic all occurs at coding time 2) the method signatures are documented.
Michael
import imaplib import inspect import types instancemethod = types.MethodType
# The function template funcwrapper = \ """ def %(name)s%(argspec)s: s,r = imaplib.IMAP4_SSL.%(name)s%(callspec)s if s!='OK': raise NotOK((s,r)) return r"""
# A helper function to get the template parameters def getargs(method): argspec = inspect.getargspec(method) callspec = tuple(argspec[:3] + (None,))# No default
return {"name": method.__name__, "argspec": inspect.formatargspec(*argspec), "callspec": inspect.formatargspec(*callspec)}
# Do the stuff manually:
>>> obj = imaplib.IMAP4_SSL
>>> attrnames = [meth for meth in dir(imaplib.IMAP4_SSL) if not meth.startswith("_")]
>>> attributes = [getattr(obj, attrname) for attrname in attrnames]
>>> methods = [attribute for attribute in attributes if inspect.ismethod(attribute)]
>>> print "\n".join(funcwrapper % getargs(method) for method in methods)
def append(self, mailbox, flags, date_time, message): s,r = imaplib.IMAP4_SSL.append(self, mailbox, flags, date_time, message) if s!='OK': raise NotOK((s,r)) return r
def authenticate(self, mechanism, authobject): s,r = imaplib.IMAP4_SSL.authenticate(self, mechanism, authobject) if s!='OK': raise NotOK((s,r)) return r
def check(self): s,r = imaplib.IMAP4_SSL.check(self) if s!='OK': raise NotOK((s,r)) return r
def close(self): s,r = imaplib.IMAP4_SSL.close(self) if s!='OK': raise NotOK((s,r)) return r
def copy(self, message_set, new_mailbox): s,r = imaplib.IMAP4_SSL.copy(self, message_set, new_mailbox) if s!='OK': raise NotOK((s,r)) return r
def create(self, mailbox): s,r = imaplib.IMAP4_SSL.create(self, mailbox) if s!='OK': raise NotOK((s,r)) return r
def delete(self, mailbox): s,r = imaplib.IMAP4_SSL.delete(self, mailbox) if s!='OK': raise NotOK((s,r)) return r
def deleteacl(self, mailbox, who): s,r = imaplib.IMAP4_SSL.deleteacl(self, mailbox, who) if s!='OK': raise NotOK((s,r)) return r
def expunge(self): s,r = imaplib.IMAP4_SSL.expunge(self) if s!='OK': raise NotOK((s,r)) return r
def fetch(self, message_set, message_parts): s,r = imaplib.IMAP4_SSL.fetch(self, message_set, message_parts) if s!='OK': raise NotOK((s,r)) return r
def getacl(self, mailbox): s,r = imaplib.IMAP4_SSL.getacl(self, mailbox) if s!='OK': raise NotOK((s,r)) return r
def getquota(self, root): s,r = imaplib.IMAP4_SSL.getquota(self, root) if s!='OK': raise NotOK((s,r)) return r
def getquotaroot(self, mailbox): s,r = imaplib.IMAP4_SSL.getquotaroot(self, mailbox) if s!='OK': raise NotOK((s,r)) return r
def list(self, directory='""', pattern='*'): s,r = imaplib.IMAP4_SSL.list(self, directory, pattern) if s!='OK': raise NotOK((s,r)) return r
def login(self, user, password): s,r = imaplib.IMAP4_SSL.login(self, user, password) if s!='OK': raise NotOK((s,r)) return r
def login_cram_md5(self, user, password): s,r = imaplib.IMAP4_SSL.login_cram_md5(self, user, password) if s!='OK': raise NotOK((s,r)) return r
def logout(self): s,r = imaplib.IMAP4_SSL.logout(self) if s!='OK': raise NotOK((s,r)) return r
def lsub(self, directory='""', pattern='*'): s,r = imaplib.IMAP4_SSL.lsub(self, directory, pattern) if s!='OK': raise NotOK((s,r)) return r
def myrights(self, mailbox): s,r = imaplib.IMAP4_SSL.myrights(self, mailbox) if s!='OK': raise NotOK((s,r)) return r
def namespace(self): s,r = imaplib.IMAP4_SSL.namespace(self) if s!='OK': raise NotOK((s,r)) return r
def noop(self): s,r = imaplib.IMAP4_SSL.noop(self) if s!='OK': raise NotOK((s,r)) return r
def open(self, host='', port=993): s,r = imaplib.IMAP4_SSL.open(self, host, port) if s!='OK': raise NotOK((s,r)) return r
def partial(self, message_num, message_part, start, length):
s,r = imaplib.IMAP4_SSL.partial(self, message_num, message_part, start, length)
if s!='OK':
raise NotOK((s,r))
return r
def print_log(self): s,r = imaplib.IMAP4_SSL.print_log(self) if s!='OK': raise NotOK((s,r)) return r
def proxyauth(self, user): s,r = imaplib.IMAP4_SSL.proxyauth(self, user) if s!='OK': raise NotOK((s,r)) return r
def read(self, size): s,r = imaplib.IMAP4_SSL.read(self, size) if s!='OK': raise NotOK((s,r)) return r
def readline(self): s,r = imaplib.IMAP4_SSL.readline(self) if s!='OK': raise NotOK((s,r)) return r
def recent(self): s,r = imaplib.IMAP4_SSL.recent(self) if s!='OK': raise NotOK((s,r)) return r
def rename(self, oldmailbox, newmailbox): s,r = imaplib.IMAP4_SSL.rename(self, oldmailbox, newmailbox) if s!='OK': raise NotOK((s,r)) return r
def response(self, code): s,r = imaplib.IMAP4_SSL.response(self, code) if s!='OK': raise NotOK((s,r)) return r
def search(self, charset, *criteria): s,r = imaplib.IMAP4_SSL.search(self, charset, *criteria) if s!='OK': raise NotOK((s,r)) return r
def select(self, mailbox='INBOX', readonly=None): s,r = imaplib.IMAP4_SSL.select(self, mailbox, readonly) if s!='OK': raise NotOK((s,r)) return r
def send(self, data): s,r = imaplib.IMAP4_SSL.send(self, data) if s!='OK': raise NotOK((s,r)) return r
def setacl(self, mailbox, who, what): s,r = imaplib.IMAP4_SSL.setacl(self, mailbox, who, what) if s!='OK': raise NotOK((s,r)) return r
def setquota(self, root, limits): s,r = imaplib.IMAP4_SSL.setquota(self, root, limits) if s!='OK': raise NotOK((s,r)) return r
def shutdown(self): s,r = imaplib.IMAP4_SSL.shutdown(self) if s!='OK': raise NotOK((s,r)) return r
def socket(self): s,r = imaplib.IMAP4_SSL.socket(self) if s!='OK': raise NotOK((s,r)) return r
def sort(self, sort_criteria, charset, *search_criteria):
s,r = imaplib.IMAP4_SSL.sort(self, sort_criteria, charset, *search_criteria)
if s!='OK':
raise NotOK((s,r))
return r
def ssl(self): s,r = imaplib.IMAP4_SSL.ssl(self) if s!='OK': raise NotOK((s,r)) return r
def status(self, mailbox, names): s,r = imaplib.IMAP4_SSL.status(self, mailbox, names) if s!='OK': raise NotOK((s,r)) return r
def store(self, message_set, command, flags): s,r = imaplib.IMAP4_SSL.store(self, message_set, command, flags) if s!='OK': raise NotOK((s,r)) return r
def subscribe(self, mailbox): s,r = imaplib.IMAP4_SSL.subscribe(self, mailbox) if s!='OK': raise NotOK((s,r)) return r
def thread(self, threading_algorithm, charset, *search_criteria):
s,r = imaplib.IMAP4_SSL.thread(self, threading_algorithm, charset, *search_criteria)
if s!='OK':
raise NotOK((s,r))
return r
def uid(self, command, *args): s,r = imaplib.IMAP4_SSL.uid(self, command, *args) if s!='OK': raise NotOK((s,r)) return r
def unsubscribe(self, mailbox): s,r = imaplib.IMAP4_SSL.unsubscribe(self, mailbox) if s!='OK': raise NotOK((s,r)) return r
def xatom(self, name, *args): s,r = imaplib.IMAP4_SSL.xatom(self, name, *args) if s!='OK': raise NotOK((s,r)) return r >>>
-- http://mail.python.org/mailman/listinfo/python-list