Add utility for getting the timestamp in ISO 8601 format.
Also get set GPG.filesystemencoding in case we have to save a file.
InheritablePropery→_util.InheritableProperty
Add .../homedir/batch-files and .../homedir/generated-keys directories.
Add a parameter to GPG.gen_key_input for saving batch files.
Remove excess EOL whitespace.
If Key-Type is 'default', force 'Subkey-Type' to also be 'default'.
Add batch file save functionality, including creating a README in that dir.
Only gnupg.__version__, not gnupg._version, should be accessible in module.
Don't attempt to set up logging to file unless logging is actually enabled.
A unicode(list()) versus a unicode(str()) are different.
Add note on using itertools.dropwhile() for efficiency in _is_allowed().

 * If/when it's rewritten, a simple speed/efficiency check can be done with:
   >>> import dis
   >>> dis.dis(_is_allowed_orig('--dragons'))
   >>> dis.dis(_is_allowed_orig('--encrypt'))
   >>> dis.dis(_is_allowed_new('--dragons'))
   >>> dis.dis(_is_allowed_new('--encrypt'))
Rewrite _check_option() in _sanitise() to be way more efficient and readable.
This log statement didn't need 2LOC.
GnuPG status code '17' on imports means '16'. That wasn't documented anywhere.
There are lots of these list(dict.items()) in the old codebase. Total nonsense.

 * These evaluate in all interpreters to functionally the same bytecode, with
   an extra LOAD_GLOBAL and then a CALL_FUNCTION for that GLOBAL which doesn't
   gets a passthrough value. I have absolutely no idea why someone thought it
   was necessary to code it this way, unless there used to be some weird dict
   bug in some version of Python (which is totally possible) that I don't
   remember and have never heard about. Disassembled:

   >>> def normal(things):
   ...     for k,v in things.items():
   ...         print "%s=%s" % (k,v)
   ...
   ...
   >>> def notnormal(things):
   ...     for k,v in list(things.items()):
   ...         print "%s=%s" % (k,v)
   ...
   >>> dis.dis(normal)
      2           0 SETUP_LOOP              41 (to 44)
                  3 LOAD_FAST                0 (things)
                  6 LOAD_ATTR                0 (items)
                  9 CALL_FUNCTION            0
                 12 GET_ITER
            >>   13 FOR_ITER                27 (to 43)
                 16 UNPACK_SEQUENCE          2
                 19 STORE_FAST               1 (k)
                 22 STORE_FAST               2 (v)

      3          25 LOAD_CONST               1 ('%s=%s')
                 28 LOAD_FAST                1 (k)
                 31 LOAD_FAST                2 (v)
                 34 BUILD_TUPLE              2
                 37 BINARY_MODULO
                 38 PRINT_ITEM
                 39 PRINT_NEWLINE
                 40 JUMP_ABSOLUTE           13
            >>   43 POP_BLOCK
            >>   44 LOAD_CONST               0 (None)
                 47 RETURN_VALUE
   >>> dis.dis(notnormal)
      2           0 SETUP_LOOP              47 (to 50)
                  3 LOAD_GLOBAL              0 (list)
                  6 LOAD_FAST                0 (things)
                  9 LOAD_ATTR                1 (items)
                 12 CALL_FUNCTION            0
                 15 CALL_FUNCTION            1
                 18 GET_ITER
            >>   19 FOR_ITER                27 (to 49)
                 22 UNPACK_SEQUENCE          2
                 25 STORE_FAST               1 (k)
                 28 STORE_FAST               2 (v)

      3          31 LOAD_CONST               1 ('%s=%s')
                 34 LOAD_FAST                1 (k)
                 37 LOAD_FAST                2 (v)
                 40 BUILD_TUPLE              2
                 43 BINARY_MODULO
                 44 PRINT_ITEM
                 45 PRINT_NEWLINE
                 46 JUMP_ABSOLUTE           19
            >>   49 POP_BLOCK
            >>   50 LOAD_CONST               0 (None)
                 53 RETURN_VALUE
GnuPG only *sometimes* returns the filename for the plaintext.

 * We can't split twice at first, because sometimes there isn't a third field
   in the string.
 * There isn't any rhyme or reason to when the filename is present or
   missing. It just is.
Switch to calling a bound super on Crypt for handle_status() method again.
Slice equiv. bytes from strings as we read() from file handles in _copy_data().
Add a utility for creating a 'user@hostname' string.