基于函数签名与argparse交互的修饰程序。

entrypoint的Python项目详细描述


这是一个decorator库,它帮助人们用python编写小脚本。

它提供三个主要功能:

*直接调用脚本时自动运行函数,但是
不是作为模块包含的。

*从函数签名自动生成参数分析器,并且
docstrings

*在调用并返回函数时自动打开和关闭文件(使用编解码器或二进制)。

这个图书馆的目的是为了方便,它在其他方面也作出了一些牺牲。值得注意的是,decorators的应用顺序有一些严格的条件。


有关更多信息,请参阅下面的说明和
函数的docstrings。要报告错误、请求功能或提交修补程序,请发送电子邮件
conrad.irwin@gmail.com。




它们包含后台信息或用于重用组件的额外接口。


1)直接调用库时自动运行函数。
这通常在python中使用:

>;def main():
…通过

main();

,可以重新写入到

>;@autorun
…def main():
…传递

警告:除非它是"最外面的"装饰器,即文件中第一个列出的装饰器,并且
最后一个应用于函数,否则这将无法按预期工作。如果只有一个decorator,那么
应该没问题——这就是为什么库还提供了@entrypoint、
@entrywithfile和@runwithfile(见下表),因此您只需要一个decorator。这个decorator将调用函数作为装饰过程的一部分。因此,在
库。
在这种情况下,您需要向它传递第二个参数,该参数指示在自动运行中,堆栈帧中上面的多个级别
您希望
名称等于主的程度。

定义自动解卷(func):
…自动运行(lambda:func(1),2)
定义输入(Y):
…打印y




2)使用适当的编码自动打开和关闭文件。


这通常使用:

>;
>;>from u future_u import with_u statement
>;>def main(文件名):
…使用codecs.open(filename,'r','utf-8')作为openfile:
…通过

,并可以用文件('r')
def main(打开文件):
…传递

可以将编解码器的名称作为第一个位置参数传递给@withfile。默认编码存储在entrypoint.encoding中,并设置为"utf-8"。

>;@withfile('utf-16','w')
…def main(打开文件):
…传递

或以"二进制"模式打开文件,不使用编解码器,只需在
规范后面加上"b":

>;@withfile('rb','a')
…def main(二进制文件,日志文件):
…打印日志文件,进程(binaryfile.read())

"w"以便以后的调用不会覆盖内容。

>;@withfile('r','a')
…def main(readfile,log='/tmp/python.log'):
…log.write("正在读取%s"%readfile.name)

args='r',stderr='a')
…def main(catfile,*args,**kwargs):
…如果参数:
…catfile.write("\n".join(arg中arg的arg.read())
…以夸尔格表示的elif'stderr:
…最后,按照许多命令行工具的惯例,使用特殊的文件名"-"引用sys.stdin进行读取,使用sys.stdout进行写入和追加。同样,这可以是默认参数,也可以由调用方传入


>;@withfile('r','w')
…def main(输入,输出="-"):
…传递

警告:文件在进入函数时打开,而不是在需要时打开,
如果打开文件进行写入,则会在磁盘上创建文件,即使不向其写入任何内容。


3)自动分析函数签名中的命令行参数,
,如果可能的话,从它的doc字符串中删除。

它只需将一个接受多个
位置参数(不支持*kwargs)的函数转换为一个接受可选参数数组的函数,并默认为sys.argv[1:

>;@acceptsargv
…def main(arg1,arg2):
…通过

…main()
…主(系统参数[1:])
…main(['arg1','arg2'])


这可以与上面的其他魔术相结合,以便在定义函数时自动调用该函数:

>;>sys.argv[1:=['arg1','arg2']
>;@entrypoint
…def主(arg1,arg2)
…传递

如果参数不匹配,参数分析器将中止程序,并打印用法消息。在
命令行中按常规方式传递-h或--help可以找到更多详细信息。

>;@entrypoint
…def main(arg1,arg2):
…pass

用法:test.py[-h]arg1 arg2
:错误:参数太少

标志参数是通过为参数提供
默认值来表示的,其类型与您希望用户
输入的类型相同。位置参数和默认值为none的标志总是被解码为unicode字符串。如果类型转换失败,它将作为错误显示给用户。

>;@entrypoint
…def main(文件名,优先级=1):
…assert isinstance(priority,int)

用法:[-h][--priority priority]文件名

def main(文件名,verbose=false):
…如果冗长:
…打印文件名

用法:[-h][--verbose]文件名

也可以使用函数的*参数:

>;@entrypoint
…def main(输出,*输入):
…打印",".join(文件名)

lso用于以与
argparse相同的方式提供面向用户的文档。它通过以下方式解析函数的文档字符串来实现此目的:


>;>def main(filename,flag=true,verbosity=3):
…""
…介绍性段落。论点的说明和澄清。

…结语…——
……
…内部文档
…""
…通过

所有部件都是可选的。介绍性段落和结语在argparse生成的参数摘要前后显示。
内部文档(位于----)完全不显示。

<;参数>;=<;澄清>;:<;说明>;
<;澄清>;=[-<;字母>;[,]]--<;标记名>;[=<;变量名>;]
=<;参数名>;[/<;displayname>;]


描述可以跨多行,并在显示
时重新形成。


在第一种情况下,-<;letter>;提供一个字母/数字缩写,用于设置标志:


>;def main(标志=true):
…"""
…-F—标志:设置标志
…""

<;argname>;、<;flagname>;、<;varname>;和<;displayname>;仅限于
[A-ZA-Z][A-ZA-Z0-9']*


而displayname和varname只是
用于向用户显示。


最后,以这种方式包装的任何函数都可以抛出一个
entrypoint.usageerror,第一个参数将作为错误显示给用户。


有几种组合可用作预定义的装饰符:


运行签名打开
自动分析文件

@autorunx

@entrypoint x

@entrywithfile x x*


@withfile x


@withfile x


@withuserfilex*

@acceptorgv x

*表示将抛出fileusageerrors而不是ioerrors以提供更多的用户友好错误报告

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java MySQL连接MAC到Windows 7   java BufferedReader在读取空行后等待30秒   java中的类继承和arraylist   在java中创建字符串的更好方法   java意图是未定义的,尝试了很多次,没有任何效果   java如何使用JGit实现“git显示标记名”的等效功能?   eclipse的java重构插件   excel Java POI将工作簿转换为文件   java将数据从文本文件显示到JTable   java检查特定行中的给定字符串   HttpResponse头的java Junit测试   java在给定代码块中查找错误(类的扩展,个人/学生)   java getActivity()。findviewbyd(R.id.myId)返回Null   ExecutorService(Java)中的并发持久变量   java无法从世界加载多个实体