如何确保在 VSCode+Jupyter+Python 中实例化数据结构时,该数据结构的属性可用于整个笔记本的自动补全。
# %% Jupyter Cell #1
#This cell is executed before attempting autocompletes in cell 2
@dataclass
class ExistingItemNames:
pass
class SearchableItemNames:
def __init__(self, var_names:list):
self.names__ = ExistingItemNames()
for name in var_names:
setattr(self.names__, name, name)
self.names = self.names__.__dict__
si = SearchableItemNames([f"v{i}" for i in range(2000)])
# %% Jupyter Cell 2
#outside other data structures, accessing through a
# dict or attr seem equivalent
si.names['v1999'] #does not find 'v1999' key via autocomplete
si.names['v10'] # does find 'v10' key via autocomplete
si.names__.v1999 #does not find `v1999` attr via autocomplete
si.names__.v10 #does find `v10` attr via autocomplete
#inside of a data structure, the dict is required for autocompletion
# but still does not find all values
(si.names__.v1999) #does not find `v1999` attr via autocomplete
(si.names__.v10) #does not find `v10` attr via autocomplete
(si.names['v1999']) #does not find 'v1999' key via autocomplete
(si.names['v10']) # does find 'v10' key via autocomplete
我知道,由于 python 语言服务器的限制,对键或 attr 进行详尽的枚举并不是适合所有用例的好解决方案,但是有没有办法可以强制 IDE(VSCode+Jupyter)仅在以下情况下这样做:某些对象、某些 python 环境或某些 Jupyter 笔记本?
根据评论,我将其放在一起。通过
attr
的自动完成功能适用于所有 attr
。不幸的是,它有一种动态 SQLly 的感觉,但对于我想要实现的东西来说效果很好。
# %% Jupyter Cell 1
tmp_dict = {f"var_{i}":f'{i}' for i in range(2000)}
dataclass_str = [f"""
from dataclasses import dataclass, field
def get_vals():
return {tmp_dict}
@dataclass
class SearchableItems:""", ]
lines = []
for k in tmp_dict:
val = tmp_dict[k]
lines.append(f"\t{k}:str = '{val}'")
dict_line = [f"\td: dict = field(default_factory = get_vals)", ]
dataclass_str = "\n".join(dataclass_str + lines + dict_line)
with open('searchable_items.py', 'w') as f:
f.write(dataclass_str)
# %% Jupyter Cell 2
from searchable_items import SearchableItems
si = SearchableItems()
# %% Jupyter Cell 3
si.var_1999 #autocompletes
si.var_10 #autocompletes
(si.var_1999) #autocompletes
(si.var_10) #autocompletes
si.d['var_10'] #autocompletes
(si.d['var_10']) #autocompletes
si.d['var_1999'] #Finds some keys like 1999, but not 1999
(si.d['var_1999']) #Finds some keys like 1999, but not 1999