-
Notifications
You must be signed in to change notification settings - Fork 1.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
DISCUSSION PR: Re-writing Entity to subclass object instead of dict. #445
Conversation
Give the discussion in #446, it seems that syntax should actually be |
First, let me note that my trailing comments give a context for this PR, but don't actually pertain to the code in the PR. To address @elibixby remarks: Yes #444 needs to be implemented for Entity('Kind', 1, prop1=u'foo') to have a chance of working. I think in addition to the constructors I mentioned above we should also enable >>> key
<Key[{'kind': 'SomeKind', 'id': 1}]>
>>> Entity(key, prop1=u'foo', prop2=u'bar')
<Entity[{'kind': 'SomeKind', 'id': 1}] {'prop1': u'foo', 'prop2': u'bar'}>
>>> Entity(key, {'prop1': u'foo', 'prop2': u'bar'})
<Entity[{'kind': 'SomeKind', 'id': 1}] {'prop1': u'foo', 'prop2': u'bar'}> This will allow for things like keys from multiple datasets in the same application and keys with namespaces. |
Is this providing too many ways to achieve the same thing? I do like the idea of being able to instantiate an entity with a path (and providing the key with the "default" dataset from the environment), but I'm not sure if Just a my $.02. I think the ideas have been fantastic so far, and am really excited with all the discussion. |
@elibixby You're probably right that we should only accept a key as a positional arg since the syntax would be the same. RE: >>> e = Entity(key, prop1=u'foo', prop2=u'bar')
>>> e.remove_prop_from_index('prop1') A full-blown ORM (like class Foo(ndb.Model):
bar = ndb.StringProperty(indexed=False) |
Yes! I like that! |
c1137f6
to
0d79df0
Compare
Changes Unknown when pulling 0d79df0 on dhermes:do-not-inherit-dict into * on GoogleCloudPlatform:master*. |
0d79df0
to
e43096a
Compare
@@ -215,7 +257,7 @@ def reload(self): | |||
entity = dataset.get_entity(key.to_protobuf()) | |||
|
|||
if entity: | |||
self.update(entity) | |||
self.update_properties(entity.to_dict()) |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
Overall, I don't see any advantage to the "object-with-a-dict" versus "object-derived-from-dict". |
@tseaver let's forget about this for now. I initially did it because I didn't want a split MRO on In the interest of "only one way", the note above for me is the best option for a constructor. (First positional arg must be a key, if more than one, second must be a dict. Otherwise, kwargs acts as the dict.) I'll rebase #456 to forget about this PR and we'll go from there (after wrapping up #444). |
Closing PR but leaving the branch alive in my fork so may revisit. It likely won't be necessary as |
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Source-Link: googleapis/synthtool@25083af Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:e6cbd61f1838d9ff6a31436dfc13717f372a7482a82fc1863ca954ec47bff8c8 Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
* docs: Fix formatting of request arg in docstring chore: Update gapic-generator-python to v1.9.1 PiperOrigin-RevId: 518604533 Source-Link: googleapis/googleapis@8a085ae Source-Link: googleapis/googleapis-gen@b2ab4b0 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiYjJhYjRiMGEwYWUyOTA3ZTgxMmMyMDkxOThhNzRlMDg5OGFmY2IwNCJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
* docs: minor comment update PiperOrigin-RevId: 512725339 Source-Link: googleapis/googleapis@ea8d826 Source-Link: googleapis/googleapis-gen@dc453f7 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiZGM0NTNmNzcwMmNkNGQzOThmZTU3NzMxMTgwNGFlYTFhZDIwNTFkYSJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
…445) Source-Link: googleapis/synthtool@95d9289 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:c8878270182edaab99f2927969d4f700c3af265accd472c3425deedff2b7fd93 Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
Source-Link: googleapis/synthtool@050953d Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:65e656411895bff71cffcae97246966460160028f253c2e45b7a25d805a5b142 Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
* chore(deps): update all dependencies * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * revert Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com> Co-authored-by: Anthonios Partheniou <partheniou@google.com>
- [ ] Regenerate this pull request now. PiperOrigin-RevId: 472561635 Source-Link: googleapis/googleapis@332ecf5 Source-Link: googleapis/googleapis-gen@4313d68 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiNDMxM2Q2ODI4ODBmZDlkNzI0NzI5MTE2NGQ0ZTlkM2Q1YmQ5ZjE3NyJ9
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
This fixes #396, but I am happy to close it if there are issues with it. (Hence the DISCUSSION in the description.)
It is a first-step towards the discussion in #336 with @elibixby and @proppy.
The
Entity
class doesn't attempt to be a dictionary, rather it provides__getitem__
(andset
anddel
) semantics andupdate_properties
andclear_properties
methods for updating the properties and leaving the rest of the entity alone.The long term goal is to provide a way to do something like:
and I think to get there this is necessary to separate the property data (as
_data
) from the other metadata.I am still trying to figure out a way to squeeze in "special" keyword arguments like
key
(may be possible to just implement a method likekey.to_args()
so we don't need a kwarg. Or instead we could check iflen(positional_args) == 1 and isinstance(positional_args[0], Key)
)dataset
(Implicit dataset from environ #444 may make this unnecessary if we take it a bit further and my design doc just says forget about it and set it on the key. Though the ID is still needed if we only have the key parts frompositional_args
.)exclude_from_indexes
(as a power-user feature, it may not be necessary to put this in the constructor)but that is outside the scope of this PR / discussion.