Skip to content
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

IPython tab-completion populates the Dict with a few unwanted fields #26

Closed
mewwts opened this issue Dec 14, 2014 · 7 comments
Closed
Labels

Comments

@mewwts
Copy link
Owner

mewwts commented Dec 14, 2014

Python 2.7.9 and Python 3.4.2

>>> a = Dict()
>>> a.  #hit tab
>>> a
{'trait_names': {}, '_getAttributeNames': {}}

I think there's similar behaviour in the interactive console in PyCharm.

@mewwts mewwts added the bug label Dec 14, 2014
@sabhiram
Copy link
Contributor

This occurs because some piece of code ends up checking to see if a given attribute is part of the Dict instance.

This will probably be an on-going problem (similar to the need for us to implement a dir method), as long as external code ends up checking to see if the object under question implements a method, or contains an attribute.

@mewwts
Copy link
Owner Author

mewwts commented Dec 16, 2014

Yup - I'm not entirely convinced there's a solid solution to this.

@sabhiram
Copy link
Contributor

We could alternatively (just for iPython) detect that we are being spawned from an iPython shell and return the appropriate expected values from the getattr code.

not_ipython = False
try:
    __IPYTHON__
except NameError:
    not_ipython = True

I don't have an iPython env around, so ill play around w/ this a bit later. Just food for thought as usual :)

@mewwts
Copy link
Owner Author

mewwts commented Jan 28, 2015

Thanks @sabhiram, but I hope and think it can be handled in a more elegant way. Perhaps not without a rather large rewrite, but we'll see.

@mewwts
Copy link
Owner Author

mewwts commented Mar 11, 2015

There's a fix that I have in a local branch which is kind of hacky.
When a nonexistent item is requested, instead of creating an empty Dict inside the original Dict, we return an empty Dict, with some (hidden) properties e.g. 'parent' and 'key'. When an item is set in this returned Dict, it attaches itself to its parent with key='key'. This would eliminate the problems we're experiencing in iPython, and also reduce the importance of prune. This does however have memory-implications.

Thougts @sabhiram, @burk, @Who8MyLunch?

@Who8MyLunch
Copy link
Contributor

The problem described by this issue is that addict.Dict is very forgiving when a key or attribute does not exist. The following code currently raise no exceptions since Dict always creates a new key if one does not already exist:

d = addict.Dict()

val_x = d.X
val_y = d['Y']

bool_z1 = hasattr(d, 'Z1')
bool_z2 = 'Z2' in d

print(d)

print(bool_z1)
print(bool_z2)

The above code produces the following output:

{'X': {}, 'Y': {}, 'Z1': {}}
True
False

Is this really the desired behavior?

Shouldn't these two lines yield similar results?

bool_z1 = hasattr(d, 'Z1')
bool_z2 = 'Z2' in d

@mewwts
Copy link
Owner Author

mewwts commented Jul 15, 2016

Hi @Who8MyLunch, sorry for the 1Y+ delay in response.

Point here is that in used __contains__ and hasattr uses __getattr__. So either we implement __contains__ to create a new key, or we leave it as it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants