Tom Plunket wrote: > I have some code to autogenerate some boilerplate code so that I don't > need to do the tedious setup stuff when I want to create a new module. > > So, my script prompts the user for the module name, then opens two > files and those files each get the contents of one of these functions: > > def GetPyContents(module): > boilerplate = \ > """ > class %s: > pass > > if __name__ == '__main__': > import unittest > unittest.main('%s_t') > """ > > return boilerplate % ((module,) * 2) > > def GetTestContents(module): > boilerplate = \ > """from %s import * > import unittest > > class Test%s(unittest.TestCase): > def testConstruction(self): > self.failUnless(%s()) > > def testWriteMoreTests(self): > self.fail('This test should fail.') > > if __name__ == '__main__': > unittest.main() > """ > > return boilerplate % ((module,) * 3) > > My question is, I don't like hardcoding the number of times that the > module name should be repeated in the two return functions. Is there > an straight forward (inline-appropriate) way to count the number of > '%s'es in the 'boilerplate' strings? ...or maybe a different and more > Pythonic way to do this? (Maybe I could somehow use generators?)
Python's string formatting comes in two flavours : positional (the one you used in your above example), and keywords: tpls = [ "%(name1)s is %(name1)s and %(name2)s is %(name2)s", "what about %(name2)s for %(name1)s ?", "Now we only deal with %(name1)s", ] data = {'name1' : 'parrot', 'name2': 'dead'} for tpl in tpls: print tpl % data As you can see, the keyword flavour doesn't care about positions nor repetitions. You may also want to look at more featured templating solutions like empy, cheetah, etc... -- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in '[EMAIL PROTECTED]'.split('@')])" -- http://mail.python.org/mailman/listinfo/python-list