确保 VSCode Python 自动完成

问题描述 投票:0回答:1

如何确保在 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 笔记本?

python visual-studio-code jupyter-notebook pylance python-jedi
1个回答
0
投票

根据评论,我将其放在一起。通过

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
© www.soinside.com 2019 - 2024. All rights reserved.