首页 > 解决方案 > 如何正确使用python模块

问题描述

我的代码开始变得杂乱无章,所以我想为存储在其中的所有函数创建一个库(或我猜的模块)。在我的代码中工作的大多数函数在从模块导入它们时都会出现以下错误:

takes 1 positional argument but 2 were given

我创建了一个名为 mylib.py 的文件。

我放入其中的第一个函数,其中许多不起作用的是这个:

def load(hist_indicator, data):   
    mask1 = data['IndicatorName'].str.contains(hist_indicator)
    dfdata = data[mask1]

    filter = dfdata['Year'] > 1995
    df = dfdata[filter]
    return df

它所做的只是需要一个 pandas DataFrame 并过滤掉我需要的数据。如果该函数在代码本身中,则该函数可以工作。我这样使用它:

ind_internet = 'Internet users \(per 1'
internet = load(ind_internet, data)

但是,当我尝试从 mylib.py 使用它时,我得到了上述错误。尝试像这样使用它:

import mylib
ind_internet = 'Internet users \(per 1'
internet = mylib.load(ind_internet, data)

我希望你能让我知道我做错了什么。

编辑:

为了补充这个问题,这里有一个小例子的代码:

import pandas as pd

def load(hist_indicator, data):   
    mask1 = data['IndicatorName'].str.contains(hist_indicator)
    dfdata = data[mask1]

    filter = dfdata['Year'] > 1995
    df = dfdata[filter]
    return df

dataf = {'CountryName':  ['France', 'Germany'],
        'CountryCode': ['FRA', 'GER'],
        'IndicatorName': ['Internet users (per 100)', 'GDP per capita (current US$)'],
        'IndicatorCode' : ['MS.MIL.XPRT.KD','SP.POP.DPND.YG'],
        'Year' : [2000,1983],
        'Value' : [15.3,4322.27]
        }

data = pd.DataFrame (dataf, columns = ['CountryName','CountryCode','IndicatorName','IndicatorCode','Year','Value'])

ind_internet = 'Internet users \(per 1'
internet = load(ind_internet, data)
internet

另外,一个编辑:我实际上并没有在代码中输入 import mylib.py ,只是在这里错误地输入了。

标签: pythonpython-3.x

解决方案


问题:
导入行import mylib.py不正确。您不需要文件扩展名.py

像这样的包的解决方案
设置:

package
   |-mylib.py
   |-test_import_mylip.py

然后在mylib.py,

# package/mylib.py
def load(hist_indicator, data):   
    mask1 = data['IndicatorName'].str.contains(hist_indicator)
    dfdata = data[mask1]

    filter = dfdata['Year'] > 1995
    df = dfdata[filter]
    return df

然后导入并使用mylib.loadfrom test_import_mylib.py,

# test_import_mylib.py
import mylib
import pandas as pd

data = pd.read_csv('path/to/df.csv')
ind_internet = 'Internet users \(per 1'

internet = mylib.load(ind_internet, data)

推荐阅读