Add column names to DataFrame.__dir__ for better auto-completion support

This commit is contained in:
Léonard Binet 2020-07-02 15:49:52 +02:00 committed by GitHub
parent f63941014f
commit 5d0df757cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 63 additions and 1 deletions

View File

@ -25,7 +25,7 @@ from eland.ndframe import NDFrame
from eland.series import Series from eland.series import Series
from eland.common import DEFAULT_NUM_ROWS_DISPLAYED, docstring_parameter from eland.common import DEFAULT_NUM_ROWS_DISPLAYED, docstring_parameter
from eland.filter import BooleanFilter from eland.filter import BooleanFilter
from eland.utils import deprecated_api from eland.utils import deprecated_api, is_valid_attr_name
class DataFrame(NDFrame): class DataFrame(NDFrame):
@ -445,6 +445,16 @@ class DataFrame(NDFrame):
def __getitem__(self, key): def __getitem__(self, key):
return self._getitem(key) return self._getitem(key)
def __dir__(self):
"""
Provide autocompletion on field names in interactive environment.
"""
return super().__dir__() + [
column_name
for column_name in self._query_compiler.columns.to_list()
if is_valid_attr_name(column_name)
]
def __repr__(self): def __repr__(self):
""" """
From pandas From pandas

View File

@ -0,0 +1,20 @@
# Licensed to Elasticsearch B.V under one or more agreements.
# Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
# See the LICENSE file in the project root for more information
# File called _pytest for PyCharm compatibility
from eland.tests.common import TestData
class TestDataFrameDir(TestData):
def test_flights_dir(self):
ed_flights = self.ed_flights()
print(dir(ed_flights))
autocomplete_attrs = dir(ed_flights)
for c in ed_flights.columns:
assert c in autocomplete_attrs

View File

@ -0,0 +1,22 @@
# Licensed to Elasticsearch B.V under one or more agreements.
# Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
# See the LICENSE file in the project root for more information
# File called _pytest for PyCharm compatibility
from eland.utils import is_valid_attr_name
class TestUtils:
def test_is_valid_attr_name(self):
assert is_valid_attr_name("_piZZa")
assert is_valid_attr_name("nice_pizza_with_2_mushrooms")
assert is_valid_attr_name("_2_pizze")
assert is_valid_attr_name("_")
assert is_valid_attr_name("___")
assert not is_valid_attr_name("4")
assert not is_valid_attr_name(4)
assert not is_valid_attr_name(None)
assert not is_valid_attr_name("4pizze")
assert not is_valid_attr_name("pizza+")

View File

@ -2,6 +2,7 @@
# Elasticsearch B.V licenses this file to you under the Apache 2.0 License. # Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
# See the LICENSE file in the project root for more information # See the LICENSE file in the project root for more information
import re
import functools import functools
import warnings import warnings
from typing import Callable, TypeVar from typing import Callable, TypeVar
@ -23,3 +24,12 @@ def deprecated_api(replace_with: str) -> Callable[[F], F]:
return wrapped return wrapped
return wrapper return wrapper
def is_valid_attr_name(s):
"""
Ensure the given string can be used as attribute on an object instance.
"""
return isinstance(s, str) and re.search(
string=s, pattern=r"^[a-zA-Z_][a-zA-Z0-9_]*$"
)