On Jan 29, 5:39 pm, kj <[EMAIL PROTECTED]> wrote: [...] > It's not the Python syntax that I'm having problems with, but rather > with larger scale issues such as the structuring of packages, > techniques for code reuse, test suites, the structure of > distributions,... Python and Perl seem to come from different > galaxies altogether... > [...] > > I'd written a Perl module to facilitate the writing of scripts. > It contained all my boilerplate code for parsing and validating > command-line options, generating of accessor functions for these > options, printing of the help message and of the full documentation, > testing, etc. > > Of course, for Python now I don't have any of this, so I must write > it all from scratch, and the thing is *I don't even know where to > begin*! And meanwhile works needs to get done, projects finished, > etc. So naturally I revert to Perl, yadda-yadda-yadda, and the > Python project gets pushed back another week... > > In a way it's the usual story with learning a new language, but > I've taught myself new languages before. (After all, there was a > time when I didn't know Perl.) It's harder this time, somehow... >
The journey of a thousand miles etc. For command line options I get a long way with this: [code python] def _getargs(): allargs = sys.argv[1:] args = [] kwargs = {} key = None while allargs: arg = allargs.pop(0) if arg.startswith('--'): key, arg = arg.split('=', 1) key = key[2:] elif arg.startswith('-'): key = arg[1:] if not allargs or allargs[0].startswith('-'): allargs.insert(0, 'yes') continue if key is None: args.append(arg) else: kwargs[key] = arg key = None return args, kwargs ARGS, KWARGS = _getargs() [/code] though obviously there's no validation. For testing see doctest module. For file and directory manipulation see os and shutil modules. The following is an abuse of docstrings, but shows some OO techniques: [code python] import inspect linesep = '\n' class TemplateBase(object): factory = None template = None verb = 'substitute' @classmethod def render(cls, **kws): if cls.template is None: cls.template = cls.factory(inspect.getdoc(cls)) return getattr(cls.template, cls.verb)(**kws) @classmethod def write(cls, fd, **kws): fd.write(linesep) fd.write(cls.render(**kws)) fd.write(linesep) @classmethod def writeiter(cls, fd, seq): for context in seq: cls.write(fd, **context) class StringTemplate(TemplateBase): import string factory = string.Template class SafeStringTemplate(StringTemplate): verb = 'safe_substitute' try: class TempitaTemplate(TemplateBase): import tempita factory = tempita.Template except ImportError: pass try: class MakoTemplate(TemplateBase): from mako.template import Template factory = Template verb = 'render' except ImportError: pass class StartJythonUnix(SafeStringTemplate): r""" #!/usr/bin/ksh java \ -Dpython.home=$jythonhome \ -classpath $jythonhome/jython.jar:$CLASSPATH \ org.python.util.jython.class """ class DefineLocalQueue(StringTemplate): """ DEFINE QLOCAL($qname) + DEFPSIST(YES) + DESCR('$descr') + STGCLASS('$stgclass') + MAXDEPTH ($maxdepth) """ class DeleteLocalQueue(TempitaTemplate): """ DELETE QLOCAL({{qname}}) """ import sys StartJythonUnix.write(sys.stdout, jythonhome="/home/dev/jython/ jython-2.1") from cStringIO import StringIO s = StringIO() DefineLocalQueue.write(s, name="AAA", descr="AAA", stgclass="AAA", maxdepth=100) DeleteLocalQueue.write(s, name="BBB", descr="BBB", stgclass="BBB", maxdepth=100) print s.getvalue() [/code] HTH Gerard -- http://mail.python.org/mailman/listinfo/python-list