We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
DISCUSSION: Should dataset ID be set on datastore key?
This question came up in the review in #282 while trying to define the "correct" behavior of `datastore.Key.__eq__`.

The only remaining use of `Key._dataset_id` is in [`to_protobuf`](https://github.com/GoogleCloudPlatform/gcloud-python/blob/b6d3e74a48e8554804ea3d33f53385bbbdb5c4b7/gcloud/datastore/key.py#L53) but #121 seems to indicate that the dataset ID is not needed on a `Key`.

ISTM we should just remove `_dataset_id` from the `Key` class, even though it is returned in the protobuf after an entity is stored/retrieved. @pcostell WDYT?


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `gcloud/datastore/key.py`
Content:
```
1 """Create / interact with gcloud datastore keys."""
2 
3 import copy
4 from itertools import izip
5 
6 from gcloud.datastore import datastore_v1_pb2 as datastore_pb
7 
8 
9 class Key(object):
10     """An immutable representation of a datastore Key.
11 
12     .. automethod:: __init__
13     """
14 
15     def __init__(self, path=None, namespace=None, dataset_id=None):
16         """Constructor / initializer for a key.
17 
18         :type namespace: :class:`str`
19         :param namespace: A namespace identifier for the key.
20 
21         :type path: sequence of dicts
22         :param path: Each dict must have keys 'kind' (a string) and optionally
23                      'name' (a string) or 'id' (an integer).
24 
25         :type dataset_id: string
26         :param dataset: The dataset ID assigned by back-end for the key.
27                         Leave as None for newly-created keys.
28         """
29         self._path = path or [{'kind': ''}]
30         self._namespace = namespace
31         self._dataset_id = dataset_id
32 
33     def _clone(self):
34         """Duplicates the Key.
35 
36         We make a shallow copy of the :class:`gcloud.datastore.dataset.Dataset`
37         because it holds a reference an authenticated connection,
38         which we don't want to lose.
39 
40         :rtype: :class:`gcloud.datastore.key.Key`
41         :returns: a new `Key` instance
42         """
43         return copy.deepcopy(self)
44 
45     def to_protobuf(self):
46         """Return a protobuf corresponding to the key.
47 
48         :rtype: :class:`gcloud.datastore.datastore_v1_pb2.Key`
49         :returns: The Protobuf representing the key.
50         """
51         key = datastore_pb.Key()
52 
53         if self._dataset_id is not None:
54             key.partition_id.dataset_id = self._dataset_id
55 
56         if self._namespace:
57             key.partition_id.namespace = self._namespace
58 
59         for item in self.path():
60             element = key.path_element.add()
61             if 'kind' in item:
62                 element.kind = item['kind']
63             if 'id' in item:
64                 element.id = item['id']
65             if 'name' in item:
66                 element.name = item['name']
67 
68         return key
69 
70     @classmethod
71     def from_path(cls, *args, **kwargs):
72         """Factory method for creating a key based on a path.
73 
74         :type args: :class:`tuple`
75         :param args: sequence of even length, where the first of each pair is a
76                      string representing the 'kind' of the path element, and
77                      the second of the pair is either a string (for the path
78                      element's name) or an integer (for its id).
79 
80         :type kwargs: :class:`dict`
81         :param kwargs: Other named parameters which can be passed to
82                        :func:`Key.__init__`.
83 
84         :rtype: :class:`gcloud.datastore.key.Key`
85         :returns: a new :class:`Key` instance
86         """
87         if len(args) % 2:
88             raise ValueError('Must pass an even number of args.')
89 
90         path = []
91         items = iter(args)
92 
93         for kind, id_or_name in izip(items, items):
94             entry = {'kind': kind}
95             if isinstance(id_or_name, basestring):
96                 entry['name'] = id_or_name
97             else:
98                 entry['id'] = id_or_name
99             path.append(entry)
100 
101         kwargs['path'] = path
102         return cls(**kwargs)
103 
104     def is_partial(self):
105         """Boolean test: is the key fully mapped onto a backend entity?
106 
107         :rtype: :class:`bool`
108         :returns: True if the last element of the key's path does not have
109                   an 'id' or a 'name'.
110         """
111         return self.id_or_name() is None
112 
113     def namespace(self, namespace=None):
114         """Namespace setter / getter.
115 
116         :type namespace: :class:`str`
117         :param namespace: A namespace identifier for the key.
118 
119         :rtype: :class:`Key` (for setter); or :class:`str` (for getter)
120         :returns: a new key, cloned from self., with the given namespace
121                   (setter); or self's namespace (getter).
122         """
123         if namespace:
124             clone = self._clone()
125             clone._namespace = namespace
126             return clone
127         else:
128             return self._namespace
129 
130     def path(self, path=None):
131         """Path setter / getter.
132 
133         :type path: sequence of dicts
134         :param path: Each dict must have keys 'kind' (a string) and optionally
135                      'name' (a string) or 'id' (an integer).
136 
137         :rtype: :class:`Key` (for setter); or :class:`str` (for getter)
138         :returns: a new key, cloned from self., with the given path (setter);
139                  or self's path (getter).
140         """
141         if path:
142             clone = self._clone()
143             clone._path = path
144             return clone
145         else:
146             return self._path
147 
148     def kind(self, kind=None):
149         """Kind setter / getter.  Based on the last element of path.
150 
151         :type kind: :class:`str`
152         :param kind: The new kind for the key.
153 
154         :rtype: :class:`Key` (for setter); or :class:`str` (for getter)
155         :returns: a new key, cloned from self., with the given kind (setter);
156                  or self's kind (getter).
157         """
158         if kind:
159             clone = self._clone()
160             clone._path[-1]['kind'] = kind
161             return clone
162         elif self.path():
163             return self._path[-1]['kind']
164 
165     def id(self, id_to_set=None):
166         """ID setter / getter.  Based on the last element of path.
167 
168         :type id_to_set: :class:`int`
169         :param id_to_set: The new ID for the key.
170 
171         :rtype: :class:`Key` (for setter); or :class:`int` (for getter)
172         :returns: a new key, cloned from self., with the given id (setter);
173                   or self's id (getter).
174         """
175         if id_to_set:
176             clone = self._clone()
177             clone._path[-1]['id'] = id_to_set
178             return clone
179         elif self.path():
180             return self._path[-1].get('id')
181 
182     def name(self, name=None):
183         """Name setter / getter.  Based on the last element of path.
184 
185         :type kind: :class:`str`
186         :param kind: The new name for the key.
187 
188         :rtype: :class:`Key` (for setter); or :class:`str` (for getter)
189         :returns: a new key, cloned from self., with the given name (setter);
190                  or self's name (getter).
191         """
192         if name:
193             clone = self._clone()
194             clone._path[-1]['name'] = name
195             return clone
196         elif self.path():
197             return self._path[-1].get('name')
198 
199     def id_or_name(self):
200         """Getter.  Based on the last element of path.
201 
202         :rtype: :class:`int` (if 'id' is set); or :class:`str` (the 'name')
203         :returns: True if the last element of the key's path has either an 'id'
204                   or a 'name'.
205         """
206         return self.id() or self.name()
207 
208     def parent(self):
209         """Getter:  return a new key for the next highest element in path.
210 
211         :rtype: :class:`gcloud.datastore.key.Key`
212         :returns: a new `Key` instance, whose path consists of all but the last
213                   element of self's path.  If self has only one path element,
214                   return None.
215         """
216         if len(self._path) <= 1:
217             return None
218         return self.path(self.path()[:-1])
219 
220     def __repr__(self):
221         return '<Key%s>' % self.path()
222
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/gcloud/datastore/key.py b/gcloud/datastore/key.py
--- a/gcloud/datastore/key.py
+++ b/gcloud/datastore/key.py
@@ -24,7 +24,15 @@
 
         :type dataset_id: string
         :param dataset: The dataset ID assigned by back-end for the key.
-                        Leave as None for newly-created keys.
+
+        .. note::
+
+           The key's ``_dataset_id`` field must be None for keys created
+           by application code.  The
+           :func:`gcloud.datastore.helpers.key_from_protobuf` factory
+           will be set the field to an appropriate value for keys returned
+           from the datastore backend.  The application **must** treat any
+           value set by the back-end as opaque.
         """
         self._path = path or [{'kind': ''}]
         self._namespace = namespace

{"golden_diff": "diff --git a/gcloud/datastore/key.py b/gcloud/datastore/key.py\n--- a/gcloud/datastore/key.py\n+++ b/gcloud/datastore/key.py\n@@ -24,7 +24,15 @@\n \n         :type dataset_id: string\n         :param dataset: The dataset ID assigned by back-end for the key.\n-                        Leave as None for newly-created keys.\n+\n+        .. note::\n+\n+           The key's ``_dataset_id`` field must be None for keys created\n+           by application code.  The\n+           :func:`gcloud.datastore.helpers.key_from_protobuf` factory\n+           will be set the field to an appropriate value for keys returned\n+           from the datastore backend.  The application **must** treat any\n+           value set by the back-end as opaque.\n         \"\"\"\n         self._path = path or [{'kind': ''}]\n         self._namespace = namespace\n", "issue": "DISCUSSION: Should dataset ID be set on datastore key?\nThis question came up in the review in #282 while trying to define the \"correct\" behavior of `datastore.Key.__eq__`.\n\nThe only remaining use of `Key._dataset_id` is in [`to_protobuf`](https://github.com/GoogleCloudPlatform/gcloud-python/blob/b6d3e74a48e8554804ea3d33f53385bbbdb5c4b7/gcloud/datastore/key.py#L53) but #121 seems to indicate that the dataset ID is not needed on a `Key`.\n\nISTM we should just remove `_dataset_id` from the `Key` class, even though it is returned in the protobuf after an entity is stored/retrieved. @pcostell WDYT?\n\n", "before_files": [{"content": "\"\"\"Create / interact with gcloud datastore keys.\"\"\"\n\nimport copy\nfrom itertools import izip\n\nfrom gcloud.datastore import datastore_v1_pb2 as datastore_pb\n\n\nclass Key(object):\n    \"\"\"An immutable representation of a datastore Key.\n\n    .. automethod:: __init__\n    \"\"\"\n\n    def __init__(self, path=None, namespace=None, dataset_id=None):\n        \"\"\"Constructor / initializer for a key.\n\n        :type namespace: :class:`str`\n        :param namespace: A namespace identifier for the key.\n\n        :type path: sequence of dicts\n        :param path: Each dict must have keys 'kind' (a string) and optionally\n                     'name' (a string) or 'id' (an integer).\n\n        :type dataset_id: string\n        :param dataset: The dataset ID assigned by back-end for the key.\n                        Leave as None for newly-created keys.\n        \"\"\"\n        self._path = path or [{'kind': ''}]\n        self._namespace = namespace\n        self._dataset_id = dataset_id\n\n    def _clone(self):\n        \"\"\"Duplicates the Key.\n\n        We make a shallow copy of the :class:`gcloud.datastore.dataset.Dataset`\n        because it holds a reference an authenticated connection,\n        which we don't want to lose.\n\n        :rtype: :class:`gcloud.datastore.key.Key`\n        :returns: a new `Key` instance\n        \"\"\"\n        return copy.deepcopy(self)\n\n    def to_protobuf(self):\n        \"\"\"Return a protobuf corresponding to the key.\n\n        :rtype: :class:`gcloud.datastore.datastore_v1_pb2.Key`\n        :returns: The Protobuf representing the key.\n        \"\"\"\n        key = datastore_pb.Key()\n\n        if self._dataset_id is not None:\n            key.partition_id.dataset_id = self._dataset_id\n\n        if self._namespace:\n            key.partition_id.namespace = self._namespace\n\n        for item in self.path():\n            element = key.path_element.add()\n            if 'kind' in item:\n                element.kind = item['kind']\n            if 'id' in item:\n                element.id = item['id']\n            if 'name' in item:\n                element.name = item['name']\n\n        return key\n\n    @classmethod\n    def from_path(cls, *args, **kwargs):\n        \"\"\"Factory method for creating a key based on a path.\n\n        :type args: :class:`tuple`\n        :param args: sequence of even length, where the first of each pair is a\n                     string representing the 'kind' of the path element, and\n                     the second of the pair is either a string (for the path\n                     element's name) or an integer (for its id).\n\n        :type kwargs: :class:`dict`\n        :param kwargs: Other named parameters which can be passed to\n                       :func:`Key.__init__`.\n\n        :rtype: :class:`gcloud.datastore.key.Key`\n        :returns: a new :class:`Key` instance\n        \"\"\"\n        if len(args) % 2:\n            raise ValueError('Must pass an even number of args.')\n\n        path = []\n        items = iter(args)\n\n        for kind, id_or_name in izip(items, items):\n            entry = {'kind': kind}\n            if isinstance(id_or_name, basestring):\n                entry['name'] = id_or_name\n            else:\n                entry['id'] = id_or_name\n            path.append(entry)\n\n        kwargs['path'] = path\n        return cls(**kwargs)\n\n    def is_partial(self):\n        \"\"\"Boolean test: is the key fully mapped onto a backend entity?\n\n        :rtype: :class:`bool`\n        :returns: True if the last element of the key's path does not have\n                  an 'id' or a 'name'.\n        \"\"\"\n        return self.id_or_name() is None\n\n    def namespace(self, namespace=None):\n        \"\"\"Namespace setter / getter.\n\n        :type namespace: :class:`str`\n        :param namespace: A namespace identifier for the key.\n\n        :rtype: :class:`Key` (for setter); or :class:`str` (for getter)\n        :returns: a new key, cloned from self., with the given namespace\n                  (setter); or self's namespace (getter).\n        \"\"\"\n        if namespace:\n            clone = self._clone()\n            clone._namespace = namespace\n            return clone\n        else:\n            return self._namespace\n\n    def path(self, path=None):\n        \"\"\"Path setter / getter.\n\n        :type path: sequence of dicts\n        :param path: Each dict must have keys 'kind' (a string) and optionally\n                     'name' (a string) or 'id' (an integer).\n\n        :rtype: :class:`Key` (for setter); or :class:`str` (for getter)\n        :returns: a new key, cloned from self., with the given path (setter);\n                 or self's path (getter).\n        \"\"\"\n        if path:\n            clone = self._clone()\n            clone._path = path\n            return clone\n        else:\n            return self._path\n\n    def kind(self, kind=None):\n        \"\"\"Kind setter / getter.  Based on the last element of path.\n\n        :type kind: :class:`str`\n        :param kind: The new kind for the key.\n\n        :rtype: :class:`Key` (for setter); or :class:`str` (for getter)\n        :returns: a new key, cloned from self., with the given kind (setter);\n                 or self's kind (getter).\n        \"\"\"\n        if kind:\n            clone = self._clone()\n            clone._path[-1]['kind'] = kind\n            return clone\n        elif self.path():\n            return self._path[-1]['kind']\n\n    def id(self, id_to_set=None):\n        \"\"\"ID setter / getter.  Based on the last element of path.\n\n        :type id_to_set: :class:`int`\n        :param id_to_set: The new ID for the key.\n\n        :rtype: :class:`Key` (for setter); or :class:`int` (for getter)\n        :returns: a new key, cloned from self., with the given id (setter);\n                  or self's id (getter).\n        \"\"\"\n        if id_to_set:\n            clone = self._clone()\n            clone._path[-1]['id'] = id_to_set\n            return clone\n        elif self.path():\n            return self._path[-1].get('id')\n\n    def name(self, name=None):\n        \"\"\"Name setter / getter.  Based on the last element of path.\n\n        :type kind: :class:`str`\n        :param kind: The new name for the key.\n\n        :rtype: :class:`Key` (for setter); or :class:`str` (for getter)\n        :returns: a new key, cloned from self., with the given name (setter);\n                 or self's name (getter).\n        \"\"\"\n        if name:\n            clone = self._clone()\n            clone._path[-1]['name'] = name\n            return clone\n        elif self.path():\n            return self._path[-1].get('name')\n\n    def id_or_name(self):\n        \"\"\"Getter.  Based on the last element of path.\n\n        :rtype: :class:`int` (if 'id' is set); or :class:`str` (the 'name')\n        :returns: True if the last element of the key's path has either an 'id'\n                  or a 'name'.\n        \"\"\"\n        return self.id() or self.name()\n\n    def parent(self):\n        \"\"\"Getter:  return a new key for the next highest element in path.\n\n        :rtype: :class:`gcloud.datastore.key.Key`\n        :returns: a new `Key` instance, whose path consists of all but the last\n                  element of self's path.  If self has only one path element,\n                  return None.\n        \"\"\"\n        if len(self._path) <= 1:\n            return None\n        return self.path(self.path()[:-1])\n\n    def __repr__(self):\n        return '<Key%s>' % self.path()\n", "path": "gcloud/datastore/key.py"}], "after_files": [{"content": "\"\"\"Create / interact with gcloud datastore keys.\"\"\"\n\nimport copy\nfrom itertools import izip\n\nfrom gcloud.datastore import datastore_v1_pb2 as datastore_pb\n\n\nclass Key(object):\n    \"\"\"An immutable representation of a datastore Key.\n\n    .. automethod:: __init__\n    \"\"\"\n\n    def __init__(self, path=None, namespace=None, dataset_id=None):\n        \"\"\"Constructor / initializer for a key.\n\n        :type namespace: :class:`str`\n        :param namespace: A namespace identifier for the key.\n\n        :type path: sequence of dicts\n        :param path: Each dict must have keys 'kind' (a string) and optionally\n                     'name' (a string) or 'id' (an integer).\n\n        :type dataset_id: string\n        :param dataset: The dataset ID assigned by back-end for the key.\n\n        .. note::\n\n           The key's ``_dataset_id`` field must be None for keys created\n           by application code.  The\n           :func:`gcloud.datastore.helpers.key_from_protobuf` factory\n           will be set the field to an appropriate value for keys returned\n           from the datastore backend.  The application **must** treat any\n           value set by the back-end as opaque.\n        \"\"\"\n        self._path = path or [{'kind': ''}]\n        self._namespace = namespace\n        self._dataset_id = dataset_id\n\n    def _clone(self):\n        \"\"\"Duplicates the Key.\n\n        We make a shallow copy of the :class:`gcloud.datastore.dataset.Dataset`\n        because it holds a reference an authenticated connection,\n        which we don't want to lose.\n\n        :rtype: :class:`gcloud.datastore.key.Key`\n        :returns: a new `Key` instance\n        \"\"\"\n        return copy.deepcopy(self)\n\n    def to_protobuf(self):\n        \"\"\"Return a protobuf corresponding to the key.\n\n        :rtype: :class:`gcloud.datastore.datastore_v1_pb2.Key`\n        :returns: The Protobuf representing the key.\n        \"\"\"\n        key = datastore_pb.Key()\n\n        if self._dataset_id is not None:\n            key.partition_id.dataset_id = self._dataset_id\n\n        if self._namespace:\n            key.partition_id.namespace = self._namespace\n\n        for item in self.path():\n            element = key.path_element.add()\n            if 'kind' in item:\n                element.kind = item['kind']\n            if 'id' in item:\n                element.id = item['id']\n            if 'name' in item:\n                element.name = item['name']\n\n        return key\n\n    @classmethod\n    def from_path(cls, *args, **kwargs):\n        \"\"\"Factory method for creating a key based on a path.\n\n        :type args: :class:`tuple`\n        :param args: sequence of even length, where the first of each pair is a\n                     string representing the 'kind' of the path element, and\n                     the second of the pair is either a string (for the path\n                     element's name) or an integer (for its id).\n\n        :type kwargs: :class:`dict`\n        :param kwargs: Other named parameters which can be passed to\n                       :func:`Key.__init__`.\n\n        :rtype: :class:`gcloud.datastore.key.Key`\n        :returns: a new :class:`Key` instance\n        \"\"\"\n        if len(args) % 2:\n            raise ValueError('Must pass an even number of args.')\n\n        path = []\n        items = iter(args)\n\n        for kind, id_or_name in izip(items, items):\n            entry = {'kind': kind}\n            if isinstance(id_or_name, basestring):\n                entry['name'] = id_or_name\n            else:\n                entry['id'] = id_or_name\n            path.append(entry)\n\n        kwargs['path'] = path\n        return cls(**kwargs)\n\n    def is_partial(self):\n        \"\"\"Boolean test: is the key fully mapped onto a backend entity?\n\n        :rtype: :class:`bool`\n        :returns: True if the last element of the key's path does not have\n                  an 'id' or a 'name'.\n        \"\"\"\n        return self.id_or_name() is None\n\n    def namespace(self, namespace=None):\n        \"\"\"Namespace setter / getter.\n\n        :type namespace: :class:`str`\n        :param namespace: A namespace identifier for the key.\n\n        :rtype: :class:`Key` (for setter); or :class:`str` (for getter)\n        :returns: a new key, cloned from self., with the given namespace\n                  (setter); or self's namespace (getter).\n        \"\"\"\n        if namespace:\n            clone = self._clone()\n            clone._namespace = namespace\n            return clone\n        else:\n            return self._namespace\n\n    def path(self, path=None):\n        \"\"\"Path setter / getter.\n\n        :type path: sequence of dicts\n        :param path: Each dict must have keys 'kind' (a string) and optionally\n                     'name' (a string) or 'id' (an integer).\n\n        :rtype: :class:`Key` (for setter); or :class:`str` (for getter)\n        :returns: a new key, cloned from self., with the given path (setter);\n                 or self's path (getter).\n        \"\"\"\n        if path:\n            clone = self._clone()\n            clone._path = path\n            return clone\n        else:\n            return self._path\n\n    def kind(self, kind=None):\n        \"\"\"Kind setter / getter.  Based on the last element of path.\n\n        :type kind: :class:`str`\n        :param kind: The new kind for the key.\n\n        :rtype: :class:`Key` (for setter); or :class:`str` (for getter)\n        :returns: a new key, cloned from self., with the given kind (setter);\n                 or self's kind (getter).\n        \"\"\"\n        if kind:\n            clone = self._clone()\n            clone._path[-1]['kind'] = kind\n            return clone\n        elif self.path():\n            return self._path[-1]['kind']\n\n    def id(self, id_to_set=None):\n        \"\"\"ID setter / getter.  Based on the last element of path.\n\n        :type id_to_set: :class:`int`\n        :param id_to_set: The new ID for the key.\n\n        :rtype: :class:`Key` (for setter); or :class:`int` (for getter)\n        :returns: a new key, cloned from self., with the given id (setter);\n                  or self's id (getter).\n        \"\"\"\n        if id_to_set:\n            clone = self._clone()\n            clone._path[-1]['id'] = id_to_set\n            return clone\n        elif self.path():\n            return self._path[-1].get('id')\n\n    def name(self, name=None):\n        \"\"\"Name setter / getter.  Based on the last element of path.\n\n        :type kind: :class:`str`\n        :param kind: The new name for the key.\n\n        :rtype: :class:`Key` (for setter); or :class:`str` (for getter)\n        :returns: a new key, cloned from self., with the given name (setter);\n                 or self's name (getter).\n        \"\"\"\n        if name:\n            clone = self._clone()\n            clone._path[-1]['name'] = name\n            return clone\n        elif self.path():\n            return self._path[-1].get('name')\n\n    def id_or_name(self):\n        \"\"\"Getter.  Based on the last element of path.\n\n        :rtype: :class:`int` (if 'id' is set); or :class:`str` (the 'name')\n        :returns: True if the last element of the key's path has either an 'id'\n                  or a 'name'.\n        \"\"\"\n        return self.id() or self.name()\n\n    def parent(self):\n        \"\"\"Getter:  return a new key for the next highest element in path.\n\n        :rtype: :class:`gcloud.datastore.key.Key`\n        :returns: a new `Key` instance, whose path consists of all but the last\n                  element of self's path.  If self has only one path element,\n                  return None.\n        \"\"\"\n        if len(self._path) <= 1:\n            return None\n        return self.path(self.path()[:-1])\n\n    def __repr__(self):\n        return '<Key%s>' % self.path()\n", "path": "gcloud/datastore/key.py"}]}