封装Python包时的乌龙(和拼写错误有得一拼)

admin 2024年5月19日02:18:22评论16 views字数 1627阅读5分25秒阅读模式

写在前面

最近在帮朋友写个敏感信息提取的工具,因为涉及文件类型过多,我想写成一个可扩展的框架出来,方便往里面添加自定义的插件,在封装自建包的时候,踩到了一个很低级的坑,记录一下。

问题现象

我封装了一个包名为FileChecker的包,目录结构如下

├─FileChecker│  │  FileCheckerBase.py│  │  SensitiveCheck.py│  │  TxtFileChecker.pymain.py

其中FileCheckerBase.py的内容如下

from abc import ABC, abstractmethodclass FileCheckerBase(ABC):    ...

TxtFileChecker.py的内容如下

from .FileCheckerBase import FileCheckerBaseclass TxtFileChecker(FileCheckerBase):    ...

FileCheckerBase.py中存放了FileCheckerBase类

而TxtFileChecker.py中存放了TxtFileChecker类,继承了FileCheckerBase类

坑这就来了,我在根目录的main.py文件下对FileChecker包进行如下调用

from FileChecker import FileCheckerBase, TxtFileChecker

只放这一句就够了,不知道大家发现问题了没有,当时我是没发现

在对TxtFileChecker进行实例化的时候,报错了

'TxtFileChecker' object is not callable

说TxtFileChecker不是一个可被调用的对象

当时当局者迷,百思不得其解

改BUG

经过一番排查,大家还记得目录结构吗

├─FileChecker│  │  FileCheckerBase.py│  │  SensitiveCheck.py│  │  TxtFileChecker.pymain.py

我在main函数中的调用

from FileChecker import FileCheckerBase, TxtFileChecker

对照一看发现,突然惊醒

我import进来的是FileCheckerBase.py和TxtFileChker.py这俩文件,而不是里面的类

方案一

正确写法应该是

from FileChecker.FileCheckerBase import FileCheckerBasefrom FileChecker.TxtFileChecker import TxtFileChecker

虽然这样解决了问题,但是我还是不满足,毕竟这么写还是有点麻烦,我每个插件难道都要这么调用吗?

方案二

于是乎,我用到了__init__.py文件,在调包的时候会率先调用包下的__init__.py文件,跟实例化类的时候类似

此时目录结构如下

├─FileChecker│  │  FileCheckerBase.py│  │  SensitiveCheck.py│  │  TxtFileChecker.py│  │  __init__.pymain.py

__init__.py内容如下

from .FileCheckerBase import FileCheckerBasefrom .TxtFileChecker import TxtFileChecker__all__ = [    FileCheckerBase,    TxtFileChecker]

通过配置__all__,来让FileChecker这个包只导出__all__中所添加的内容

此时,我便可以直接通过FileChecker来调用FileCheckerBase和TxtFileChecker

from FileChecker import FileCheckerBase, TxtFileChecker

这个时候这样写也是可以正常使用的

感觉这个坑和拼写错误有得一拼(捂脸)

END

原文始发于微信公众号(飞羽技术工坊):封装Python包时的乌龙(和拼写错误有得一拼)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月19日02:18:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   封装Python包时的乌龙(和拼写错误有得一拼)https://cn-sec.com/archives/2031751.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息