我有返回一些结果的函数。我想将这些函数作为库访问:它们将被导入并用于一些较大的脚本中。这很简单。但是,我想将这些函数用作单独的脚本,将结果输出到stdout
以用于管道目的。以这种方式编写我的函数是否有意义?
def myfunction(params=(), to_stdout=False):
result = whatever_i_want_to_process(params)
if to_stdout is True:
sys.stdout.writelines(result)
return result
还是有更好,更有效,更直观的方式来做我想做的事吗?
更具体地说,每个函数都接受一个原始输入(来自stdin
或原始字符串),并为其添加内容:
def add_name(content, to_stdout=False):
result = content + "\nadded name"
if to_stdout is True:
sys.stdout.writelines(result)
return result
def add_surname(content, to_stdout=False):
result = content + "\nadded surname"
if to_stdout is True:
sys.stdout.writelines(result)
return result
def add_name_and_surname(content, to_stdout=False):
result = add_surname(add_name(content))
if to_stdout is True:
sys.stdout.writelines(result)
return result
所以我想把这两个第一个函数用作库,没有什么可以改变的,但是我也希望能够将这两个函数称为shell脚本,结果可以用管道传输:
$ echo "Here is my content" | add_name
有没有可行的方法呢?首先测试to_stdout
变量是否有意义,还是容易出错且效率低下?
我也在考虑使用click
库轻松地从函数构建命令。
使用click
库,函数如下所示:
import click
import os, sys
@click.command()
@click.argument('content', required=False)
@click.option('--to_stdout', default=True)
def add_name(content, to_stdout=False):
if not content:
content = ''.join(sys.stdin.readlines())
result = content + "\n\tadded name"
if to_stdout is True:
sys.stdout.writelines(result)
return result
@click.command()
@click.argument('content', required=False)
@click.option('--to_stdout', default=True)
def add_surname(content, to_stdout=False):
if not content:
content = ''.join(sys.stdin.readlines())
result = content + "\n\tadded surname"
if to_stdout is True:
sys.stdout.writelines(result)
return result
@click.command()
@click.argument('content', required=False)
@click.option('--to_stdout', default=False)
def add_name_and_surname(content, to_stdout=False):
result = add_surname(add_name(content))
if to_stdout is True:
sys.stdout.writelines(result)
return result
这样我就可以使用setup.py
文件和pip install --editable .
生成三个命令“add_name”,“add_surname”和“add_name_and_surname”然后我能够管道:
$ echo "original content" | add_name | add_surname
original content
added name
added surname
然而,当使用不同的click
命令作为函数进行编写时,我需要解决一个小问题:
$echo "original content" | add_name_and_surname
Usage: add_name_and_surname [OPTIONS] [CONTENT]
Error: Got unexpected extra arguments (r i g i n a l c o n t e n t
)
我不知道为什么会得到那个结果。