def argv(*args, **opts):
    """
    Produces an argument vector from its array of arguments and keyword
    options. First, the options are unpacked. When the value is a ``bool``,
    the option is passed without an argument if it is true and skipped if it
    is ``false``. When the option is one of the flat built-in types -- a
    ``string`` or ``unicode`` or ``bytes`` or an ``int`` or a ``long`` or a
    ``float`` -- it is passed literally. If the value is a subclass of
    ``dict``, ``.items()`` is called on it the option is passed multiple times
    for key-value pair, with the key and value joined by an ``=``. Otherwise,
    if the value is iterable, the option is passed once for each element, and
    each element is treated like an atomic type. Underscores in the names of
    options are turned in to dashes. If the name of an option is a single
    letter, only a single dash is used when passing it. If an option is passed
    with the key ``__`` and value ``True``, it is put at the end of the
    argument list. The arguments are appended to the end of the argument list,
    each on treated as an atomic type.

    >>> argv.argv(1, 2, 'a', u'ü', dev='/dev/cba', v=True, y=[3,2])
    ['-y', '3', '-y', '2', '--dev', '/dev/cba', '-v', '1', '2', 'a', u'\xfc']

    """
    spacer = ["--"] if opts.get("__") else []
    args = [arg(_) for _ in args]
    opts = [_ for k, v in opts.items() for _ in opt(k, v)]
    return opts + spacer + args
Produces an argument vector from its array of arguments and keyword
    options. First, the options are unpacked. When the value is a ``bool``,
    the option is passed without an argument if it is true and skipped if it
    is ``false``. When the option is one of the flat built-in types -- a
    ``string`` or ``unicode`` or ``bytes`` or an ``int`` or a ``long`` or a
    ``float`` -- it is passed literally. If the value is a subclass of
    ``dict``, ``.items()`` is called on it the option is passed multiple times
    for key-value pair, with the key and value joined by an ``=``. Otherwise,
    if the value is iterable, the option is passed once for each element, and
    each element is treated like an atomic type. Underscores in the names of
    options are turned in to dashes. If the name of an option is a single
    letter, only a single dash is used when passing it. If an option is passed
    with the key ``__`` and value ``True``, it is put at the end of the
    argument list. The arguments are appended to the end of the argument list,
    each on treated as an atomic type.

    >>> argv.argv(1, 2, 'a', u'ü', dev='/dev/cba', v=True, y=[3,2])
    ['-y', '3', '-y', '2', '--dev', '/dev/cba', '-v', '1', '2', 'a', u'\xfc']