本文完全转载自:https://github.com/google/python-fire/blob/master/docs/guide.md#version-3-firefireobject

fire简单参考实例:http://blog.csdn.net/u010099080/article/details/70332074

The Python Fire Guide

Introduction

Welcome to the Python Fire guide! Python Fire is a Python library that will turnany Python component into a command line interface with just a single call toFire.

Let's get started!

Installation

To install Python Fire from pypi, run:

pip install fire

Alternatively, to install Python Fire from source, clone the source and run:

python setup.py install

Hello World

Version 1: fire.Fire()

The easiest way to use Fire is to take any Python program, and then simply callfire.Fire() at the end of the program. This will expose the full contents ofthe program to the command line.

import firedef hello(name):return 'Hello {name}!'.format(name=name)if __name__ == '__main__':fire.Fire()

Here's how we can run our program from the command line:

$ python example.py hello World
Hello World!
Version 2: fire.Fire(<fn>)

Let's modify our program slightly to only expose the hello function to thecommand line.

import firedef hello(name):return 'Hello {name}!'.format(name=name)if __name__ == '__main__':fire.Fire(hello)

Here's how we can run this from the command line:

$ python example.py World
Hello World!

Notice we no longer have to specify to run the hello function, because wecalled fire.Fire(hello).

Version 3: Using a main

We can alternatively write this program like this:

import firedef hello(name):return 'Hello {name}!'.format(name=name)def main():fire.Fire(hello)if __name__ == '__main__':main()

Or if we're usingentry points,then simply this:

import firedef hello(name):return 'Hello {name}!'.format(name=name)def main():fire.Fire(hello)

Exposing Multiple Commands

In the previous example, we exposed a single function to the command line. Nowwe'll look at ways of exposing multiple functions to the command line.

Version 1: fire.Fire()

The simplest way to expose multiple commands is to write multiple functions, andthen call Fire.

import firedef add(x, y):return x + ydef multiply(x, y):return x * yif __name__ == '__main__':fire.Fire()

We can use this like so:

$ python example.py add 10 20
30
$ python example.py multiply 10 20
200

You'll notice that Fire correctly parsed 10 and 20 as numbers, rather thanas strings. Read more about argument parsing here.

Version 2: fire.Fire(<dict>)

In version 1 we exposed all the program's functionality to the command line. Byusing a dict, we can selectively expose functions to the command line.

import firedef add(x, y):return x + ydef multiply(x, y):return x * yif __name__ == '__main__':fire.Fire({'add': add,'multiply': multiply,})

We can use this in the same way as before:

$ python example.py add 10 20
30
$ python example.py multiply 10 20
200
Version 3: fire.Fire(<object>)

Fire also works on objects, as in this variant. This is a good way to exposemultiple commands.

import fireclass Calculator(object):def add(self, x, y):return x + ydef multiply(self, x, y):return x * yif __name__ == '__main__':calculator = Calculator()fire.Fire(calculator)

We can use this in the same way as before:

$ python example.py add 10 20
30
$ python example.py multiply 10 20
200
Version 4: fire.Fire(<class>)

Fire also works on classes. This is another good way to expose multiplecommands.

import fireclass Calculator(object):def add(self, x, y):return x + ydef multiply(self, x, y):return x * yif __name__ == '__main__':fire.Fire(Calculator)

We can use this in the same way as before:

$ python example.py add 10 20
30
$ python example.py multiply 10 20
200

Why might you prefer a class over an object? One reason is that you can passarguments for constructing the class too, as in this broken calculator example.

import fireclass BrokenCalculator(object):def __init__(self, offset=1):self._offset = offsetdef add(self, x, y):return x + y + self._offsetdef multiply(self, x, y):return x * y + self._offsetif __name__ == '__main__':fire.Fire(BrokenCalculator)

When you use a broken calculator, you get wrong answers:

$ python example.py add 10 20
31
$ python example.py multiply 10 20
201

But you can always fix it:

$ python example.py add 10 20 --offset=0
30
$ python example.py multiply 10 20 --offset=0
200

Unlike calling ordinary functions, which can be done both with positionalarguments and named arguments (--flag syntax), arguments to __init__functions must be passed with the --flag syntax. See the section oncalling functions for more.

Grouping Commands

Here's an example of how you might make a command line interface with groupedcommands.

class IngestionStage(object):def run(self):return 'Ingesting! Nom nom nom...'class DigestionStage(object):def run(self, volume=1):return ' '.join(['Burp!'] * volume)def status(self):return 'Satiated.'class Pipeline(object):def __init__(self):self.ingestion = IngestionStage()self.digestion = DigestionStage()def run(self):self.ingestion.run()self.digestion.run()if __name__ == '__main__':fire.Fire(Pipeline)

Here's how this looks at the command line:

$ python example.py run
Ingesting! Nom nom nom...
Burp!
$ python example.py ingestion run
Ingesting! Nom nom nom...
$ python example.py digestion run
Burp!
$ python example.py digestion status
Satiated.

You can nest your commands in arbitrarily complex ways, if you're feeling grumpyor adventurous.

Accessing Properties

In the examples we've looked at so far, our invocations of python example.pyhave all run some function from the example program. In this example, we simplyaccess a property.

from airports import airportsimport fireclass Airport(object):def __init__(self, code):self.code = codeself.name = dict(airports).get(self.code)self.city = self.name.split(',')[0] if self.name else Noneif __name__ == '__main__':fire.Fire(Airport)

Now we can use this program to learn about airport codes!

$ python example.py --code=JFK code
JFK
$ python example.py --code=SJC name
San Jose-Sunnyvale-Santa Clara, CA - Norman Y. Mineta San Jose International (SJC)
$ python example.py --code=ALB city
Albany-Schenectady-Troy

By the way, you can find thisairports module here.

Chaining Function Calls

When you run a Fire CLI, you can take all the same actions on the result ofthe call to Fire that you can take on the original object passed in.

For example, we can use our Airport CLI from the previous example like this:

$ python example.py --code=ALB city upper
ALBANY-SCHENECTADY-TROY

This works since upper is a method on all strings.

So, if you want to set up your functions to chain nicely, all you have to do ishave a class whose methods return self. Here's an example.

import fireclass BinaryCanvas(object):"""A canvas with which to make binary art, one bit at a time."""def __init__(self, size=10):self.pixels = [[0] * size for _ in range(size)]self._size = sizeself._row = 0  # The row of the cursor.self._col = 0  # The column of the cursor.def __str__(self):return '\n'.join(' '.join(str(pixel) for pixel in row) for row in self.pixels)def show(self):print(self)return selfdef move(self, row, col):self._row = row % self._sizeself._col = col % self._sizereturn selfdef on(self):return self.set(1)def off(self):return self.set(0)def set(self, value):self.pixels[self._row][self._col] = valuereturn selfif __name__ == '__main__':fire.Fire(BinaryCanvas)

Now we can draw stuff :).

$ python example.py move 3 3 on move 3 6 on move 6 3 on move 6 6 on move 7 4 on move 7 5 on __str__
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 1 0 0 0
0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

It's supposed to be a smiley face.

Can we make an even simpler example than Hello World?

Yes, this program is even simpler than our original Hello World example.

import fire
english = 'Hello World'
spanish = 'Hola Mundo'
fire.Fire()

You can use it like this:

$ python example.py english
Hello World
$ python example.py spanish
Hola Mundo

Calling Functions

Arguments to a constructor are passed by name using flag syntax --name=value.

For example, consider this simple class:

import fireclass Building(object):def __init__(self, name, stories=1):self.name = nameself.stories = 1def climb_stairs(self, stairs_per_story=10):for story in range(self.stories):for stair in range(1, stairs_per_story):yield stairyield 'Phew!'yield 'Done!'if __name__ == '__main__':fire.Fire(Building)

We can instantiate it as follows: python example.py --name="Sherrerd Hall"

Arguments to other functions may be passed positionally or by name using flagsyntax.

To instantiate a Building and then run the climb_stairs function, thefollowing commands are all valid:

$ python example.py --name="Sherrerd Hall" --stories=3 climb_stairs 10
$ python example.py --name="Sherrerd Hall" climb_stairs --stairs_per_story=10
$ python example.py --name="Sherrerd Hall" climb_stairs --stairs-per-story 10
$ python example.py climb-stairs --stairs-per-story 10 --name="Sherrerd Hall"

You'll notice that hyphens and underscores (- and _) are interchangeable inmember names and flag names.

You'll also notice that the constructor's arguments can come after thefunction's arguments or before the function.

You'll also notice that the equal sign between the flag name and its value isoptional.

Functions with *varargs and **kwargs

Fire supports functions that take *varargs or **kwargs. Here's an example:

import firedef order_by_length(*items):"""Orders items by length, breaking ties alphabetically."""sorted_items = sorted(items, key=lambda item: (len(str(item)), str(item)))return ' '.join(sorted_items)if __name__ == '__main__':fire.Fire(order_by_length)

To use it, we run:

$ python example.py dog cat elephant
cat dog elephant

You can use a separator to indicate that you're done providing arguments to afunction. All arguments after the separator will be used to process the resultof the function, rather than being passed to the function itself. The defaultseparator is the hyphen -.

Here's an example where we use a separator.

$ python example.py dog cat elephant - upper
CAT DOG ELEPHANT

Without the separator, upper would have been treated as another argument.

$ python example.py dog cat elephant upper
cat dog upper elephant

You can change the separator with the --separator flag. Flags are alwaysseparated from your Fire command by an isolated --. Here's an example where wechange the separator.

$ python example.py dog cat elephant X upper -- --separator=X
CAT DOG ELEPHANT

Separators can be useful when a function accepts *varargs, **kwargs, ordefault values that you don't want to specify. It is also important to rememberto change the separator if you want to pass - as an argument.

Argument Parsing

The types of the arguments are determined by their values, rather than by thefunction signature where they're used. You can pass any Python literal from thecommand line: numbers, strings, tuples, lists, dictionaries, (sets are onlysupported in some versions of Python). You can also nest the collectionsarbitrarily as long as they only contain literals.

To demonstrate this, we'll make a small example program that tells us the typeof any argument we give it:

import fire
fire.Fire(lambda obj: type(obj).__name__)

And we'll use it like so:

$ python example.py 10
int
$ python example.py 10.0
float
$ python example.py hello
str
$ python example.py '(1,2)'
tuple
$ python example.py [1,2]
list
$ python example.py True
bool
$ python example.py {name: David}
dict

You'll notice in that last example that bare-words are automatically replacedwith strings.

Be careful with your quotes! If you want to pass the string "10", rather thanthe int 10, you'll need to either escape or quote your quotes. Otherwise Bashwill eat your quotes and pass an unquoted 10 to your Python program, whereFire will interpret it as a number.

$ python example.py 10
int
$ python example.py "10"
int
$ python example.py '"10"'
str
$ python example.py "'10'"
str
$ python example.py \"10\"
str

Be careful with your quotes! Remember that Bash processes your arguments first,and then Fire parses the result of that.If you wanted to pass the dict {"name": "David Bieber"} to your program, youmight try this:

$ python example.py '{"name": "David Bieber"}'  # Good! Do this.
dict
$ python example.py {"name":'"David Bieber"'}  # Okay.
dict
$ python example.py {"name":"David Bieber"}  # Wrong. This is parsed as a string.
str
$ python example.py {"name": "David Bieber"}  # Wrong. This isn't even treated as a single argument.
<error>
$ python example.py '{"name": "Justin Bieber"}'  # Wrong. This is not the Bieber you're looking for. (The syntax is fine though :))
dict
Boolean Arguments

The tokens True and False are parsed as boolean values.

You may also specify booleans via flag syntax --name and --noname, which setname to True and False respectively.

Continuing the previous example, we could run any of the following:

$ python example.py --obj=True
bool
$ python example.py --obj=False
bool
$ python example.py --obj
bool
$ python example.py --noobj
bool

Be careful with boolean flags! If a token other than another flag immediatelyfollows a flag that's supposed to be a boolean, the flag will take on the valueof the token rather than the boolean value. You can resolve this: by putting aseparator after your last flag, by explicitly stating the value of the booleanflag (as in --obj=True), or by making sure there's another flag after anyboolean flag argument.

Using Fire Flags

Fire CLIs all come with a number of flags. These flags should be separated fromthe Fire command by an isolated --. If there is at least one isolated --argument, then arguments after the final isolated -- are treated as flags,whereas all arguments before the final isolated -- are considered part of theFire command.

One useful flag is the --interactive flag. Use the --interactive flag on anyCLI to enter a Python REPL with all the modules and variables used in thecontext where Fire was called already available to you for use. Other usefulvariables, such as the result of the Fire command will also be available. Usethis feature like this: python example.py -- --interactive.

You can add the help flag to any command to see help and usage information. Fireincorporates your docstrings into the help and usage information that itgenerates. Fire will try to provide help even if you omit the isolated --separating the flags from the Fire command, but may not always be able to, sincehelp is a valid argument name. Use this feature like this:python example.py -- --help.

The complete set of flags available is shown below, in the reference section.

Reference

Setup Command Notes
install pip install fire  
Creating a CLI
Creating a CLI Command Notes
import import fire  
Call fire.Fire() Turns the current module into a Fire CLI.
Call fire.Fire(component) Turns component into a Fire CLI.
Flags
Using a CLI Command Notes
Help command -- --help Show help and usage information for the command.
REPL command -- --interactive Enter interactive mode.
Separator command -- --separator=X This sets the separator to X. The default separator is -.
Completion command -- --completion Generate a completion script for the CLI.
Trace command -- --trace Gets a Fire trace for the command.
Verbose command -- --verbose Include private members in the output.

Note that flags are separated from the Fire command by an isolated -- arg.

Disclaimer

Python Fire is not an official Google product.

python-fire的使用相关推荐

  1. 谷歌开源 Python Fire:可自动生成命令行接口

    为什么80%的码农都做不了架构师?>>>    今天我们很高兴地宣布 Python Fire 开源.Python Fire 可从任何 Python 代码生成命令行接口(command ...

  2. Python fire官方文档教学(自动生成命令行,个人觉得意义不大,不如argparse)

    0x00 简介 欢迎来到Python Fire指南! Python Fire是一个Python库,只需对Fire进行一次调用即可将任何Python组件转变为命令行界面. 让我们开始吧! 0x01 安装 ...

  3. python fire使用指南

    0x00 简介 欢迎来到Python Fire指南! Python Fire是一个Python库,只需对Fire进行一次调用即可将任何Python组件转变为命令行界面. 让我们开始吧! 0x01 安装 ...

  4. 谷歌的开源Python工具包fire

    转自:coordinate 0x00 简介 欢迎来到Python Fire指南! Python Fire是一个Python库,只需对Fire进行一次调用即可将任何Python组件转变为命令行界面. 让 ...

  5. python开源库推荐_推荐5个值得关注的Python开源项目

    原标题:推荐5个值得关注的Python开源项目 今天小编看到了五个开源项目,觉得还错,推荐给大家. 1.Wagtail CMS Wagtail是一个基于Django的CMS系统 它拥有优质的用户体验 ...

  6. 10 个最值得 Python 新人练手的有趣项目

    作者 | Claire D. Costa 编译 | Wendy 有很多 Python 新手留言问:"Python 入门很久了,但项目经验很少,有没有什么项目,可以让自己实践一下呢?" ...

  7. 10 个最值得 Python 新人练手的有趣项目 | 赠书

    作者 | Claire D. Costa 编译 | Wendy 有很多 Python 新手留言问:"Python 入门很久了,但项目经验很少,有没有什么项目,可以让自己实践一下呢?" ...

  8. python安装选项_python设置执行选项参数

    1. sys 可以通过sys.argv得到参数列表,其中sys.argv[0]是文件名称,此后的列表值是每一个参数,这里的参数列表也支持常规的列表操作 for data in sys.argv: pr ...

  9. 70个python毕设项目_10 个最值得 Python 新人练手的有趣项目

    有很多 Python 新手留言问:"Python 入门很久了,但项目经验很少,有没有什么项目,可以让自己实践一下呢?" 这是个很普遍的问题,首先你要想好做什么类别的项目,总体来说, ...

  10. python3项目-30 个惊艳的Python开源项目

    原标题:30 个惊艳的Python开源项目 在过去的一年里,Mybridge AI 比较了近15000个开源Python项目,选择了前30名(概率只有0.2%). 这是一个竞争异常激烈的名单,精挑细选 ...

最新文章

  1. 类型、值和变量(一)
  2. echarts图表第一个案例
  3. 神经网络中的矩阵求导及反向传播推导
  4. 标定中是什么意思_机械加工中,测头有什么作用呢?
  5. java编写计算器实现cancel_用Java编写的简易计算器
  6. Spring→简介核心作用范围、框架、接口编程、IOC控制反转、单元测试、Bean容器、注入、作用域、生命周期、自动装配注入、自动扫描@注解
  7. asp.net学习之ado.net(无连接模式中的DataAdapter)
  8. MySQL 宣布停止使用 master、slave!
  9. 使用mono构建c#脚本运行环境
  10. png在线转换icns
  11. 【K最近邻法(KNN)】的Python和R语言简单实现鸢尾花分类
  12. GEE-Python 遥感大数据处理
  13. 图片倒影控件ReflectionImage
  14. WIN10 +pytorch版yolov3训练自己数据集
  15. 因为此版本的应用程序不支持其项目类型(.csproj)
  16. [3DsMAX]建模软件的分享
  17. 如何打造极速F1赛事?乐视云用六路信号还原比赛现场
  18. 施努卡:CCD视觉对位系统在贴合机的应用
  19. 《富爸爸巴比伦最富有的人》读书笔记3000字
  20. Linux下的网络设备驱动

热门文章

  1. 闰年流程图——18网三杨捷
  2. 【Java】【编译】javac编译源代码时,若源文件使用了别的java源代码的函数,javac会自动关联。...
  3. Shell-杀死指定进程
  4. Sqlserver2008 数据库镜像会话的初始连接
  5. 从鞋子的磨损度看性格
  6. 不支持对系统目录进行即席更新
  7. 语音信号处理基础(一)
  8. [转载] python数据类型转换
  9. [转载] Go语言的自重写程序
  10. [转载] AWS之EMR数据ES通过数据仓库HIVE同步S3