some problem in python
1. __main__ & __name__
有人一句话概括了这段代码的意义:
”Make a script both importable and executable“
意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行。
demo
# -*- coding: utf-8 -*-
# module
def main():
print('we are in %s'%__name__)
if __name__ == '__main__':
main()
执行后的结果为we are in __main__
# -*- coding: utf-8 -*-
# anothermodule
from python.module import main
main()
执行后的结果为we are in module
这说明了什么呢????
但是没有显示”we are in __main__“,也就是说模块__name__ = ‘__main__’ 下面的函数没有执行。
这样既可以让“模块”文件运行,也可以被其他模块引入,而且不会执行函数2次。这才是关键。
总结一下:
如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == ‘__main__’“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。
这个功能还有一个用处:调试代码的时候,在”if __name__ == ‘__main__’“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够work.
还可以参考https://www.crifan.com/python_detailed_explain_about___name___and___main__/
2. directory与python package
problem
LZ我在使用import一个子文件的中class的时候,发生了错误。发现了这个新手问题。
Directory
Directory在pycharm中就是一个文件夹,放置资源文件,对应于在进行JavaWeb开发时用于放置css/js文件的目录,或者说在进行物体识别时,用来存储背景图像的文件夹。该文件夹其中并不包含_ _ init.py_ _文件
Python package
对于Python package 文件夹而言,与Directory不同之处在于其会自动创建_ _ init.py_ _文件。
简单的说,python package就是一个目录,其中包括一组模块和一个_ _ init.py_ _文件。
该文件与Python的import机制有关,这关乎到你的哪些.py文件是对外可访问的。有些时候,如果一个包下有很多模块,在调用方import如此多模块是很费事,且不优雅的,此时可以通过修改_ _ init_ _.py来完成该任务。
在_ _ init_ .py中定义特殊变量_ all_ ,将要包含的模块复制给该变量,例如在Image/ _ init_ .py中定义 all _=[‘tiff’,’bmp’,’jpg’],这里的all 对应的就是 from …import * 中*代指的模块,此时在引用方使用如下语句:
其实_ _ init_ .py可以为空,当其为空时,from Image import * 将Image包下所有的模块都进行引用,如果想要控制引用的模块,则可以自行定义 all _
demo
from .batch import Batch
from .dataset import Dataset, TabularDataset, ZipDataset
from .example import Example
from .field import Field
from .iterator import (batch, BucketIterator, Iterator, BPTTIterator,
pool)
from .pipeline import Pipeline
from .utils import get_tokenizer, interleave_keys
__all__ = ["Batch",
"Dataset", "TabularDataset", "ZipDataset",
"Example",
"Field",
"batch", "BucketIterator", "Iterator", "BPTTIterator",
"pool",
"Pipeline",
"get_tokenizer", "interleave_keys"]