'Get / create a Mongo collection.
Raises :class:`TypeError` if `name` is not an instance of
:class:`basestring` (:class:`str` in python 3). Raises
:class:`~pymongo.errors.InvalidName` if `name` is not a valid
collection name. Any additional keyword arguments will be used
as options passed to the create command. See
:meth:`~pymongo.database.Database.create_collection` for valid
options.
If `create` is ``True``, `collation` is specified, or any additional
keyword arguments are present, a ``create`` command will be
sent. Otherwise, a ``create`` command will not be sent and the
collection will be created implicitly on first use.
:Parameters:
- `database`: the database to get a collection from
- `name`: the name of the collection to get
- `create` (optional): if ``True``, force collection
creation even without options being set
- `codec_options` (optional): An instance of
:class:`~bson.codec_options.CodecOptions`. If ``None`` (the
default) database.codec_options is used.
- `read_preference` (optional): The read preference to use. If
``None`` (the default) database.read_preference is used.
- `write_concern` (optional): An instance of
:class:`~pymongo.write_concern.WriteConcern`. If ``None`` (the
default) database.write_concern is used.
- `read_concern` (optional): An instance of
:class:`~pymongo.read_concern.ReadConcern`. If ``None`` (the
default) database.read_concern is used.
- `collation` (optional): An instance of
:class:`~pymongo.collation.Collation`. If a collation is provided,
it will be passed to the create collection command. This option is
only supported on MongoDB 3.4 and above.
- `**kwargs` (optional): additional keyword arguments will
be passed as options for the create collection command
.. versionchanged:: 3.4
Support the `collation` option.
.. versionchanged:: 3.2
Added the read_concern option.
.. versionchanged:: 3.0
Added the codec_options, read_preference, and write_concern options.
Removed the uuid_subtype attribute.
:class:`~pymongo.collection.Collection` no longer returns an
instance of :class:`~pymongo.collection.Collection` for attribute
names with leading underscores. You must use dict-style lookups
instead::
collection[\'__my_collection__\']
Not:
collection.__my_collection__
.. versionchanged:: 2.2
Removed deprecated argument: options
.. versionadded:: 2.1
uuid_subtype attribute
.. mongodoc:: collections'

def __init__(self, database, name, create=False, codec_options=None, read_preference=None, write_concern=None, read_concern=None, **kwargs):

    super(Collection, self).__init__((codec_options or database.codec_options), (read_preference or database.read_preference), (write_concern or database.write_concern), (read_concern or database.read_concern))
    if (not isinstance(name, string_type)):
        raise TypeError(('name    must    be    an    instance    of    %s' % (string_type.__name__,)))
    if ((not name) or ('..' in name)):
        raise InvalidName('collection    names    cannot    be    empty')
    if (('$' in name) and (not (name.startswith('oplog.$main') or name.startswith('$cmd')))):
        raise InvalidName(("collection    names    must    not    contain    '$':    %r" % name))
    if ((name[0] == '.') or (name[(-1)] == '.')):
        raise InvalidName(("collection    names    must    not    start    or    end    with    '.':    %r" % name))
    if ('\x00' in name):
        raise InvalidName('collection    names    must    not    contain    the    null    character')
    collation = validate_collation_or_none(kwargs.pop('collation', None))
    self.__database = database
    self.__name = _unicode(name)
    self.__full_name = (_UJOIN % (self.__database.name, self.__name))
    if (create or kwargs or collation):
        self.__create(kwargs, collation)
    self.__write_response_codec_options = self.codec_options._replace(unicode_decode_error_handler='replace', document_class=dict)
