Python包构建-导入用于类定义的函数

Python包构建-导入用于类定义的函数,python,class,Python,Class,我正在构建一个python包,它基本上是一个围绕请求包的包装器,旨在简化对一组数据库的各种api调用 目前,我的软件包具有以下目录结构: package\ - __init__.py - coreFunc.py subpackage\ - __init__.py - mod1.py - mod2.py 该软件包的主要功能在于mod1.py和mod2.pymod1.py如下所示: import requests as _requests from packag

我正在构建一个python包,它基本上是一个围绕请求包的包装器,旨在简化对一组数据库的各种api调用

目前,我的软件包具有以下目录结构:

package\
  - __init__.py
  - coreFunc.py
  subpackage\
    - __init__.py
    - mod1.py
    - mod2.py
该软件包的主要功能在于
mod1.py
mod2.py
mod1.py
如下所示:

import requests as _requests
from package.coreFunc import __func1

class DataPull:
    def __init__(self, arg1):
      self._url = "http://www.somesite.com/info?"
      self._api_param = {'argument':__func1(arg1)}
      self._pull = _requests.get(self._url, params = self._api_param)
    def DataTableOne(self):
        _headers = self._pull.json()['resultSets'][0]['headers']
        _values = self._pull.json()['resultSets'][0]['rowSet']
        return [dict(zip(_headers, value)) for value in _values]
    def DataTableTwo(self):
        _headers = self._pull.json()['resultSets'][1]['headers']
        _values = self._pull.json()['resultSets'][1]['rowSet']
        return [dict(zip(_headers, value)) for value in _values]
def __func1(x):
    if str(x) == "1999":
    return "1999-00"
elif len(str(x)) == 4:
    try:
        return "-".join([str(x),str(int(x) % 100 + 1)])
    except: 
        raise Exception("Enter the four-digit year")
else: raise Exception("Enter the four-digit year")
coreFunc.py
中,我有一些函数需要在
mod1.py
mod2.py
中的特定类中使用。事实上,在类定义的第三行中,我正在使用
coreFunc
中定义的函数(
\uu func1
)来修改参数的用户输入,以确保将正确的值传递给api调用

coreFunc.py如下所示:

import requests as _requests
from package.coreFunc import __func1

class DataPull:
    def __init__(self, arg1):
      self._url = "http://www.somesite.com/info?"
      self._api_param = {'argument':__func1(arg1)}
      self._pull = _requests.get(self._url, params = self._api_param)
    def DataTableOne(self):
        _headers = self._pull.json()['resultSets'][0]['headers']
        _values = self._pull.json()['resultSets'][0]['rowSet']
        return [dict(zip(_headers, value)) for value in _values]
    def DataTableTwo(self):
        _headers = self._pull.json()['resultSets'][1]['headers']
        _values = self._pull.json()['resultSets'][1]['rowSet']
        return [dict(zip(_headers, value)) for value in _values]
def __func1(x):
    if str(x) == "1999":
    return "1999-00"
elif len(str(x)) == 4:
    try:
        return "-".join([str(x),str(int(x) % 100 + 1)])
    except: 
        raise Exception("Enter the four-digit year")
else: raise Exception("Enter the four-digit year")
我使用一个类来进行此调用,因为调用会产生多个数据表,并且我使用方法来访问每个数据表

我的问题是,当我尝试创建DataPull类的对象时:

newObj = DataPull(argument)
给我以下错误:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-24-e3399cf393bd> in <module>()
----> 1 traceback.extract_stack(package.mode1.DataPull("203112"))

C:\Users\Bradley\Anaconda3\lib\site-packages\test-package-py3.4.egg\package\subpackage\mod1.py in __init__(self, arg1)
    140         self._url = "http://www.somesite.com/info?"
--> 141         self._api_param = {"Season":__func1(arg1)}

NameError: name '_DataPull__func1' is not defined
---------------------------------------------------------------------------
NameError回溯(最近一次呼叫上次)
在()
---->1回溯提取堆栈(package.mode1.DataPull(“203112”))
C:\Users\Bradley\Anaconda3\lib\site packages\test-package-py3.4.egg\package\subpackage\mod1.py in\uuuuuu init\uuuuu(self,arg1)
140自我。_url=”http://www.somesite.com/info?"
-->141 self._api_param={“季节”:(arg1)}
名称错误:未定义名称“\u DataPull\u func1”

如何将
\uu func1
正确导入mod1.py以修复此错误?

函数前有两个下划线表示它是私有的。您可以将其重命名为
\u func1
,它将正常工作

或者,按如下方式导入
\uu func1

from package.coreFunc import __func1 as _func1
并在
\uuuu init\uuuu
中使用
\ufunc1
而不是
\uu func1

这是一种情况,在类定义中,任何前面有
\uuuuuu
的内容都会更改为
\u classname\uu attr
。引用文件:

任何形式的标识符
\uu spam
(至少两个前导下划线, 最多一个尾随下划线)以文本形式替换为
\u classname\uu spam
,其中classname是具有 删除前导下划线。这种弄脏是不加考虑的 标识符的语法位置,只要它出现 在类的定义中

这是在源代码级别完成的,因此您可以将类定义中要使用的函数名更改为其他名称,这样就可以正常工作


相关CPython代码来自:


在问题正文和完整回溯中添加
coreFunc
的代码。