Why does my use of NDB's `populate()` not accept `id` or `parent`, but only `key`?

I want to create an entity object and after its construction, before writing it into the datastore, I want to set parent and id.

According to App Engine docs, the constructor accepts these keyword arguments:
-

id

-

key

-

parent

You cannot easily define a property named "key", "id", "parent", or
"namespace". If you pass, for example, key="foo" in a constructor or
populate() call, it sets the entity's key, not a property attribute
named "key".

For

populate()

, it says it would accept the same keyword arguments as the constructor. However, it seems I'm doing something wrong, because the only keyword argument that works is

parent is a property of a Key when using ancestor paths. The constructor accepts it as a convenience but since it is not its own property, populate() will complain that it does not exist. Same goes for id. The constructor uses id to construct a Key using _get_kind() and the value of id.

An example is worth 1000 comments. See how id and parent are used to construct a key