【问题标题】:Hide imports within another package python在另一个包python中隐藏导入
【发布时间】:2022-02-11 06:58:22
【问题描述】:

问题

我经常使用 Jupyter,在使用 jupyter 时,我有相同的导入列表,但又长又麻烦,例如:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from IPython.core.display import display, HTML
from ipywidgets import interact, IntSlider
from IPython.display import display

pd.options.display.max_columns = 35
pd.options.display.max_rows = 300

plt.rcParams['figure.figsize'] = [12, 8]
plt.rcParams['figure.dpi'] = 170 # 200 e.g. is really fine, but slower

import IPython.display as ipd
plt.ion()

display(HTML("<style>.container { width:95% !important; }</style>"))


def plot_frozen(df, num_rows=30, num_columns=30, step_rows=1,
                  step_columns=1):
    """
    Freeze the headers (column and index names) of a Pandas DataFrame. A widget
    enables to slide through the rows and columns.

    Parameters
    ----------
    df : Pandas DataFrame
        DataFrame to display
    num_rows : int, optional
        Number of rows to display
    num_columns : int, optional
        Number of columns to display
    step_rows : int, optional
        Step in the rows
    step_columns : int, optional
        Step in the columns

    Returns
    -------
    Displays the DataFrame with the widget
    """
    @interact(last_row=IntSlider(min=min(num_rows, df.shape[0]),
                                 max=df.shape[0],
                                 step=step_rows,
                                 description='rows',
                                 readout=False,
                                 disabled=False,
                                 continuous_update=True,
                                 orientation='horizontal',
                                 slider_color='purple'),
              last_column=IntSlider(min=min(num_columns, df.shape[1]),
                                    max=df.shape[1],
                                    step=step_columns,
                                    description='columns',
                                    readout=False,
                                    disabled=False,
                                    continuous_update=True,
                                    orientation='horizontal',
                                    slider_color='purple'))
    def _freeze_header(last_row, last_column):
        display(df.iloc[max(0, last_row-num_rows):last_row,
                        max(0, last_column-num_columns):last_column])

它是导入和一堆绘图/显示辅助函数。

有没有办法让我将所有这些捆绑到一个 pip 包中,这样我就只能有一两行?

我在想象跑步:

pip install Genesis

然后在我的 jupyter 笔记本里面有:

import Genesis

没有别的了。


我尝试过的:

我尝试制作一个 genesis 包,它基本上是 this guide 的副本,但有一个名为 jupyter.py 的文件,其中包含上面的设置代码。

然后我运行以下命令:

from Genesis import jupyter
jupyter.setup()

但它不会为我导入 pandasnumpymatplotlib.pyplot。这是有道理的,因为这些包是在包的范围内导入的。但是有什么办法可以避免呢?在 Python 中甚至有可能吗?

【问题讨论】:

    标签: python python-3.x pip jupyter-notebook package


    【解决方案1】:

    你可以用你所有的导入来制作一个包,你只需要注意命名空间。

    假设我有一个文件:

    # genesis/__init__.py
    import pandas as pd
    import numpy as np
    ...
    

    导入创世包将运行该代码,但无法直接访问

    >>> import genesis
    >>> help(np)
    raceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'np' is not defined
    
    >>> help(genesis.np) # This should succeed
    ...
    

    您可以使用 from genesis import * 解决此问题,这会将所有内容都带入您期望的命名空间

    例如

    >>> from genesis import *
    >>> help(np) # This should succeed
    ...
    

    【讨论】:

    • 这是一个非常简单和聪明的解决方法。谢谢!
    猜你喜欢
    • 2014-04-30
    • 2017-09-23
    • 2019-07-07
    • 2017-07-13
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    相关资源
    最近更新 更多