为了账号安全,请及时绑定邮箱和手机立即绑定

使 util 文件无法在 python 中访问

使 util 文件无法在 python 中访问

慕姐8265434 2023-06-06 10:29:37
我正在构建一个 python 库。我希望用户可用的功能在 stemmer.py 中。Stemmer.py 使用 stemmerutil.py我想知道是否有办法让用户无法访问 stemmerutil.py。
查看完整描述

1 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

如果您想对用户隐藏实施细节,可以采用两种方法。第一个使用约定来表示什么是公共 API 的一部分,什么不是公共 API 的一部分,另一个是 hack。


在 python 库中声明 API 的约定是将所有应公开的类/函数/名称添加到最顶层的__all__-list__init__.py中。它并没有做那么多有用的事情,现在它的主要目的是象征性的“请使用这个而不是别的”。你的可能看起来有点像这样:

urdu/urdu/__init__.py

from urdu.stemmer import Foo, Bar, Baz
__all__ = [Foo, Bar, Baz]

为了强调这一点,你也可以在他们的名字之前用stemmerUtil.py 下划线给出所有的定义,例如def privateFunc(): ...变成def _privateFunc(): ...


但是您也可以通过将代码作为资源而不是包中的模块并动态加载它来对解释器隐藏代码。这是一个 hack,可能是个坏主意,但在技术上是可行的。

首先,你重命名stemmerUtil.py为 just stemmerUtil- 现在它不再是一个 python 模块,不能用import关键字导入。接下来,更新这一行stemmer.py

import stemmerUtil

import importlib.util

import importlib.resources  

# in python3.7 and lower, this is importlib_resources and needs to be installed first



stemmer_util_spec = importlib.util.spec_from_loader("stemmerUtil", loader=None)

stemmerUtil = importlib.util.module_from_spec(stemmer_util_spec)


with importlib.resources.path("urdu", "stemmerUtil") as stemmer_util_path:

    with open(stemmer_util_path) as stemmer_util_file:

        stemmer_util_code = stemmer_util_file.read()

exec(stemmer_util_code, stemmerUtil.__dict__)

运行此代码后,您可以stemmerUtil像导入它一样使用该模块,但安装您的包的任何人都看不到它 - 除非他们也运行此确切代码。


但正如我所说,如果您只是想与您的用户交流您的包的哪一部分是公共 API,那么第一种解决方案更为可取。


查看完整回答
反对 回复 2023-06-06
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信