有没有办法将__init__.py多个文件组织到模块中?
原因:模块比包更容易使用,因为它们没有尽可能多的命名空间层.
通常它会生成一个包,我得到了.问题在于包,'import thepackage'给了我一个空命名空间.然后,用户必须使用"from the package import*"(不赞成)或确切知道包含的内容并手动将其拉出到可用的命名空间中.
我想要的是用户"导入包"并拥有看起来像这样的干净名称空间,公开与项目相关的函数和类以供使用.
current_module
\
doit_tools/
\
- (class) _hidden_resource_pool
- (class) JobInfo
- (class) CachedLookup
- (class) ThreadedWorker
- (Fn) util_a
- (Fn) util_b
- (Fn) gather_stuff
- (Fn) analyze_stuff
Run Code Online (Sandbox Code Playgroud)
维护者的工作是避免在不同的文件中定义相同的名称,这在项目像我的一样小时应该很容易.
如果人们可以做from doit_stuff import JobInfo并让它检索类,而不是包含该类的模块,那也是很好的.
如果我的所有代码都在一个巨大的文件中,这很容易,但我喜欢在事情变得越来越重要时组织起来.我在磁盘上看到的有点像这样:
place_in_my_python_path/
doit_tools/
__init__.py
JobInfo.py
- class JobInfo:
NetworkAccessors.py
- class _hidden_resource_pool:
- class CachedLookup:
- class ThreadedWorker:
utility_functions.py
- def util_a()
- def util_b()
data_functions.py
- def gather_stuff()
- def analyze_stuff()
Run Code Online (Sandbox Code Playgroud)
我只将它们分开,所以我的文件不是很庞大且无法通知.它们都是相关的,尽管有人(可能是我)可能想要自己使用这些类而不导入所有内容. …
我可能在这里有一个独特的情况.我希望gVim(gui版本,在Linux中)隐藏隐藏的字符,无论如何,即使光标在该行上或该字符被选中.(如果字符从不存在,它应该尽可能接近.)当前隐藏的字符在光标进入该行时显示,这会导致文本在滚动和选择文本时跳转.
我们使用gView(只读gVim)来查看日志,以便利用其强大的语法突出显示功能.问题是,这些日志包含许多转义字符和TTY颜色代码,这使得阅读变得困难.(^ [33mSomeText ^ [0米)
我正在使用这一行来隐藏它们:
syntax match Ignore /\%o33\[[0-9]\{0,5}m/ conceal
Run Code Online (Sandbox Code Playgroud)
由于这些文件是由非vim专家查看的,因此当文本无法隐藏时,它看起来很奇怪而且破碎了.(如果颜色代码存在,也看起来很奇怪和破碎,如果颜色代码变黑变得不可见,但在复制/粘贴后仍然显示,但仍会显示出毛刺和破损.)
这应该没问题,因为:
这些文件在gview中以只读方式打开,带有额外的"set nomodifiable",使得保存文件变得更加困难.虽然可以编辑并尝试保存日志,但这样做既被认为是无效的事情,也是无害的事情,并且需要足够的Vim技能,如果有人设法编辑文件他们知道他们是什么做的事情." 能够使用隐藏文本编辑行的问题不适用.
如果无法将"隐藏"配置为隐藏隐藏文本,则可接受的替代方法是在打开文件时用空格替换TTY颜色代码.但是,这必须在只读模式下完成,并且我们不能让gview在关闭窗口时抛出保存对话框,因为该文件已被其.vimrc修改.
注意:我完全控制读取这些文件时源的.vim脚本文件,但无法控制TTY颜色代码的存在或在gview中打开日志文件的代码.(即我不能通过sed或类似的东西传递它.)理想的解决方案是任何可以透明地从.vimrc中核对颜色代码的东西,但我会听到任何建议."隐藏"功能只是我最有希望的领先优势.
所以,任何想法如何永久摆脱这些文件视图没有对话框弹出关闭?
似乎__repr__函数可以返回不同的方式.
我有一个InfoObj类,它存储了很多东西,其中一些我并不特别希望自己设置类的用户.我意识到没有什么蟒蛇是受保护的,他们可能只是潜水,并设置也无妨,但似乎在定义它__init__使得它更可能有人会看到它,并假设它是罚款,只是传递进去.
(示例:当确定对象已完全填充时由验证函数设置的布尔值,以及存储足够信息时从其他值计算的值...例如A = B + C,所以一次设置A和B,然后计算C并将对象标记为Valid = True.)
那么,考虑到所有这些,哪个是设计__ repr__输出的最佳方法?
bob = InfoObj(Name="Bob")
# Populate bob.
# Output type A:
bob.__repr__()
'<InfoObj object at 0x1b91ca42>'
# Output type B:
bob.__repr__()
'InfoObj(Name="Bob",Pants=True,A=7,B=5,C=2,Valid=True)'
# Output type C:
bob.__repr__()
'InfoObj.NewInfoObj(Name="Bob",Pants=True,A=7,B=5,C=2,Valid=True)'
Run Code Online (Sandbox Code Playgroud)
...类型C的要点是不愉快地将我在C++中设置为"私有"的所有东西作为构造函数的参数,并让使用该类的队友使用接口函数设置它,即使它更多的工作对他们来说 在这种情况下,我将定义一个不带某些东西的构造函数,以及一个稍微难以注意到的单独函数,用于__repr__
如果它有所不同,我打算使用它们的__repr__输出将这些python对象存储在数据库中并使用它们进行检索eval(),至少除非我想出更好的方法.队友手动创建完整对象而不是通过正确的接口函数的结果只是一种类型的信息检索可能不稳定,直到有人弄清楚他做了什么.
首先我知道'进口'.当我尝试'导入'时,它不起作用.我要做的是将一个模块分成两部分,其中一部分可以由一个组编辑,另一部分则不可编辑.我希望该组能够编写定义良好的"检索函数",而无需编辑运行它们的后端代码的诱惑或能力(甚至意外)."导入"中名称空间的更改正在阻碍我.我正在寻找在File_B中包含File_A文本的宏样式,以便内联运行,就像它是File_B的一部分一样.
这就是我正在做的事情:
我有一些通用代码,用于依次调用信息检索函数列表,并以统一的方式存储信息.为此,我将其文本名称添加到列表中:
DataTypes = ['TypeA','TypeB','TypeC']
Run Code Online (Sandbox Code Playgroud)
...然后定义一个知道如何获取每个类型的函数,并返回一个填充的对象类:
def Get_TypeA:
# do some stuff to retrieve info
InfoObj Data
# Populate Data with the info I got
return Data
def Get_TypeB:
# etc. etc.
return Data
def Get_TypeC:
# etc. etc.
return Data
# Backend code below this line, hopefully nobody touches it?
# (But really it would be best if this was in a different file
# that is harder to mess with and has locked-down permissions.)
class InfoObj:
# …Run Code Online (Sandbox Code Playgroud)