Rationale and Design Goals

In Python, the need to generate random strings comes up frequently and is accomplished usually (though not always) via something like the following code snippet:

import random
import string
mykey = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(10))

This generates a string that is 10 characters made of uppercase letters and digits. Unfortunately, this solution becomes cumbersome when real-world requirements are added. Take for example, the typical requirement to generate a password: “a password shall have 6 - 20 characters of which at least one must be a digit and at least one must be a special character”. The above solution then becomes much more complicated and changing the requirements is an error-prone and unnecessarily complex task.

The equivalent using the strgen package:

from strgen import StringGenerator as SG
SG('[\u\d]{10}').render()

strgen is far more compact, flexible and feature-rich than using the standard solution:

  • It tries to use a better entropy mechanism and falls back gracefully if this is not available on the host OS.

  • The user can easily modify the specification (template) with minimal effort without the fear of introducing hard-to-test code paths.

  • It covers a broader set of use cases: unique ids, persistent unique filenames, test data, etc.

  • The template syntax is easy to learn for anyone familiar with regular expressions while being much simpler.

  • It supports unicode.

  • It works on Python 2.6, 2.7 and 3.x.

  • It proposes a standard way of expressing common requirements, like “a password shall have 6 - 20 characters of which at least one must be a digit and at least one must be a special character”:

    [\l\d]{4:18}&[\d]&[\p]
    

This package is designed with the following goals in mind:

  • Provide an abstract template language that does not depend on a specific implementation language.

  • Reduce dependencies on other packages.

  • Keep syntax as simple as possible while being useful.

  • Provide an implementation design with associated behaviour that strikes the right balance between ease-of-implementation and ease-of-use.

  • Superficially similar to regular expressions to enable developers to quickly pick up the template syntax.

  • Support non-ASCII languages (unicode).