这不是一个片断的作品一半时间的插件,它是一个非常流畅的编辑体验。我刚刚开始使用 pyflyby,到目前为止它很可靠。我在 neovim 中每次保存 python 文件时都会自动导入,并且在 ipython 中的每个命令上都会自动导入。

我无法告诉你我对此有多兴奋,以及过去几周使用它的感觉有多好。这是光荣的。

YouTube 视频

听我咆哮飞越有多棒_

给视频看一下,我没有在obs中降噪。我对背景嗡嗡声和麦克风支架颠簸表示歉意。我尽力修复它们。

安装

如何安装 pyflyby 以进行自动 python 导入

pyflypy 托管在 pypi 上,因此您可以使用 pip 获取它。到目前为止,我在 3.8+ 上安装它没有任何问题。

pip install flybypy

进入全屏模式 退出全屏模式

configuration setup with stow

总是存放你的点文件

如果你要配置你的任何工具,你应该做的第一件事就是用 stow 设置它,认真不要睡在 stow 上。如果您没有安装 stow 或选择不使用 stow,则可以跳过此部分。

cd ~/dotfiles
mkdir ipython
touch ipython/.pyflyby
stow ipython

进入全屏模式 退出全屏模式

真的不要睡在堆垛上。

如何配置pyflyby

它只是一个充满导入语句的文件

pyflyby的配置很简单,只需将您想要自动导入的所有导入语句放入您的~/.pyflyby文件中。您可以使用import pandasfrom pandas import DataFrame甚至import pandas as pd,所有这些都将按预期工作。

# comments start with a #
# import your favorite libraries
import visidata as vd
import fsspec
import difflib
import s3fs
import seaborn as sns
import plotly

# also supports from imports
from rich.layout import Layout
from rich.live import Live

# duplicates are allowed
import plotly
import plotly

# duplicate names from different libraries are not allowed
import copy
from numpy import copy

进入全屏模式 退出全屏模式

添加您希望自动导入的所有内容,就像导入它们一样。我有点疯狂,并根据我使用的软件包添加了 200 多个。

甚至支持逗号

是的,支持所有导入样式

以下示例将为 DataFrame 和 Series 设置自动导入,它们将分别工作。我从我的配置中删除了这些,因为我觉得没有它更干净,但它适用于它们。

from pandas import DataFrame, Series

进入全屏模式 退出全屏模式

即使是带逗号的导入也会被单独处理。

jupyter 注意!

两者的工作方式相同,使用您喜欢的方式

我在这里只真正提到了 ipython,但同样适用于 jupyter。我真的很喜欢 ipython 本身,来吧,它就在终端中,与您的其他终端体验完美集成。

ipython 设置

使用pyflyby在ipython中自动导入python库

从文档中设置flybypy的推荐方法是运行以下魔法命令。这很好用,但我打字更少,我希望 pyflyby 自动安装并导入东西,而我什至不考虑它。

%load_ext pyflyby

进入全屏模式 退出全屏模式

抱歉,您的浏览器不支持嵌入视频。

ipython setup next level

自动在python中导入模块无需%load_ext

我真的希望 pyflyby 能够在每个环境中工作,而无需我考虑太多。我希望它自动加载,甚至在它丢失时尝试自行安装。

from IPython import get_ipython
import subprocess


ipython = get_ipython()

try:
    ipython.magic("load_ext pyflyby")
except ModuleNotFoundError:
    print("installing pyflyby")
    subprocess.Popen(
        ["pip", "install", "pyflyby"],
        stdout=subprocess.DEVNULL,
        stderr=subprocess.DEVNULL,
    ).wait()
    ipython.magic("load_ext pyflyby")

进入全屏模式 退出全屏模式

注意:如果安装失败,你仍然会进入 ipython,当你输入失败的命令时,只会有一个回溯。

我对此的问题为零,但是如果有一段时间它在某些环境中对您不起作用。我强烈建议您将此添加到单独的配置文件中。

[

Ipython-Config 的文章封面

](https://waylonwalker.com/ipython-config/)

查看这篇文章以获得更深入的 ipython 配置

ipython 自动导入示例

pyflyby 可以很好地导入所有各种导入类型。

  • 导入东西

  • 从模块导入一些东西

  • 导入一些东西作为别名

df = pd.read_csv("https://waylonwalker.com/cars.csv")
[PYFLYBY] import pandas as pd

进入全屏模式 退出全屏模式

获得帮助

如果需要有关 pyflyby 配置中某些内容的帮助,只需给它???help,pyflyby 就会为您导入它。

Popen?

进入全屏模式 退出全屏模式

[

Just Ask Ipython for help 的文章封面

](https://waylonwalker.com/ipython-help/)

这篇文章在 ipython 中有更多获取帮助的方法。

自动完成

这是下一级python自动导入

pyflyby 甚至可以帮助完成制表符。如果您尝试使用 tab 完成Pop它将完成到Popen甚至无需将Popen添加到您的本地命名空间。如果您要求模块内部的某些内容,即requests.<tab>,那么它将导入请求。

# does not populate the namespace
Pop<tab>

# !!does populate the local namespace
requests.<tab>

进入全屏模式 退出全屏模式

未安装模块时会发生什么

_ ModuleNotFoundError _

当您处于未安装 pyflyby 配置中的模块的环境中时,它会在尝试导入时抛出ModuleNotFoundError并且不会导入或尝试为您安装。您将不得不更改环境或安装该模块。

❯ pd?
[PYFLYBY] import pandas as pd
[PYFLYBY] Error attempting to 'import pandas as pd': ModuleNotFoundError: No module named 'pandas'
[PYFLYBY] Traceback (most recent call last):
[PYFLYBY]   File "/home/u_walkews/.local/lib/python3.8/site-packages/pyflyby/_autoimp.py", line 1610, in _try_import
[PYFLYBY]     exec_(stmt, scratch_namespace)
[PYFLYBY]   File "<string>", line 1, in <module>
[PYFLYBY] ModuleNotFoundError: No module named 'pandas'
Object `pd` not found.

❯ df = pd.read_csv("https://waylonwalker.com/cars.csv")
<ipython-input-3-69b040434562>:1 in <module>

NameError: name 'pd' is not defined

进入全屏模式 退出全屏模式

nvim pyflyby 设置

在vim、neovim、nvim中自动导入python模块

这是迄今为止这篇文章最好的部分。它使发展变得如此流畅。不一定全都与速度有关。它确实可以帮助您按照自己的想法移动,而无需担心导入。记住深度嵌套的模块在哪里并不需要。

function! s:PyPreSave()
    Black
endfunction

function! s:PyPostSave()
    execute "silent !tidy-imports --black --quiet --replace-star-imports --action REPLACE " . bufname("%")
    execute "e"
endfunction

:command! PyPreSave :call s:PyPreSave()
:command! PyPostSave :call s:PyPostSave()

augroup waylonwalker
    autocmd!
    autocmd bufwritepre *.py execute 'PyPreSave'
    autocmd bufwritepost *.py execute 'PyPostSave'
    autocmd bufwritepost .tmux.conf execute ':!tmux source-file %'
    autocmd bufwritepost .tmux.local.conf execute ':!tmux source-file %'
    autocmd bufwritepost *.vim execute ':source %'
augroup end

进入全屏模式 退出全屏模式

抱歉,您的浏览器不支持嵌入视频。

重构

这是它真正闪耀的地方

当你进行重构时,这个设置真的很出色。您可以自由移动模块和类,而不必担心带来导入。通常,在将某些模块从一个文件重构到另一个文件时,最乏味的部分是编辑导入。通常你甚至不能抓住整行,因为有几个进口,两个地方都需要一些,但不是全部。 pyflyby 像冠军一样处理这一切。

抱歉,您的浏览器不支持嵌入视频。

vim安装在哪里

只要确保 tidy-imports 命令对 vim 可用

pyflyby 进入您在启动 neovim 时处于活动状态的环境。通常,这是我用于正在编辑的项目的虚拟环境。

导入/删除的内容

只给我我实际使用的东西

如果在文件/控制台中使用,pyflyby 的基本配置或您自己在~/.pyflyby中指定的配置中的任何内容都将自动导入。如果您正在处理文件并停止使用模块,它将自动被删除。

  • 任何使用过的,在配置中找到的都被添加

  • 任何未使用的东西都会被移除

在哪里放进口

在最后一次导入之后

pyflyby不会按段落或类别对导入进行排序。当它需要添加新的导入时。它将在您的文件中找到最后一段导入,添加新的一段,然后按字母顺序对该段进行排序。

from collections import Counter

import requests

from plugins.custom_seo import post_render
# <-- pyflyby will put the import here

进入全屏模式 退出全屏模式

isort呢

把这些进口货放在哪里

我不喜欢在使用 pyflyby 时遇到预提交问题,因此我将 isort 添加到我的自动命令链中以自动运行 isort 并使我的预提交满意。

function! s:PyPostSave()
    execute "silent !tidy-imports --black --quiet --replace-star-imports --action REPLACE " . bufname("%")
    execute "silent !isort " . bufname("%")
    execute "e"
endfunction

进入全屏模式 退出全屏模式

让我们写一些代码

def get():
    """
    Get all the posts from waylonwalker.com.

    Yes theres an rss feed, you should be subscribed if your not already.

    Oh, and we don't need no stinkin error handing because it's always live
    """
    r = requests.get("https://waylonwalker.com/rss")
    return r.content

进入全屏模式 退出全屏模式

保存它,flyby 会自动将请求注入您的文件,无需再输入。

import requests

def get():
    """
    Get all the posts from waylonwalker.com.

    Yes theres an rss feed, you should be subscribed if your not already.

    Oh, and we don't need no stinkin error handing because it's always live
    """
    r = requests.get("https://waylonwalker.com/rss")
    return r.content

进入全屏模式 退出全屏模式

那么init / api的

小心填写`all`,就像你应该做的那样

init.py 之类的文件通常会导入他们不需要的东西,这只是为了方便库用户并让 api 更清洁。这些类型的模块应该实现一个__all__列表,其中列出了根据 pep8 导入的所有未使用的东西。 Pyflyby 将删除任何未使用的模块,除非它们在__all__列表中。

# snippet from kedro.extras.datasets.pandas

__all__ = [
    "CSVDataSet",
    "ExcelDataSet",
    "FeatherDataSet",
    "GBQTableDataSet",
    "ExcelDataSet",
    "AppendableExcelDataSet",
    "HDFDataSet",
    "JSONDataSet",
    "ParquetDataSet",
    "SQLQueryDataSet",
    "SQLTableDataSet",
]

进入全屏模式 退出全屏模式

抱歉,您的浏览器不支持嵌入视频。

py命令

一个需要进口的班轮

pyflyby 还带有一个 cli 命令来运行一个衬里。它非常巧妙,我相信我会找到一两个用途,但到目前为止,它对我来说更像是一种新奇事物。

py help pd
py help pd.DataFrame

py pd.read_csv 'https://waylonwalker.com/cars.csv'

进入全屏模式 退出全屏模式

抱歉,您的浏览器不支持嵌入视频。

友情链接

  • pyflyby repo

  • 文档

  • My YouTube Video for pyfly来自

  • 配置 ipython

  • 向 ipython 求助??

  • 我和pandas一起使用的样本数据

  • 我的 RSS 订阅

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐