import fire defhello(name): return('Hello {name} !'.format(name=name)) if __name__ == "__main__": fire.Fire(hello) python first.py ZHENG Hello ZHENG !
Ⅲ.暴露多个函数
1.直接暴露
原理也一样的,其实整个代码中的所有函数都暴露了。
1 2 3 4 5 6 7 8 9 10 11
import fire defadd(x, y): return x + y defmultiply(x, y): return x * y if __name__ == '__main__': fire.Fire() python example.py add 1020 30 python example.py multiply 1020 200
你会注意到Fire正确地将10和20解析为数字,而不是字符串。 可以看0X09 参数解析。
2.暴露多个函数(字典)
通过字典来实现,使用方法还是和原来一样,不过可以更换函数名字来使用了
1 2 3 4 5 6 7 8 9 10
import fire defadd(x, y): return x + y defmultiply(x, y): return x * y if __name__ == '__main__': fire.Fire({ 'fun1': add, 'fun2': multiply, })
暴露对象(object)中的多个函数
这是暴露多个命令的一个好的做法。其实相当于打了个包
1 2 3 4 5 6 7 8 9 10
import fire classCalculator(object): defadd(self, x, y): return x + y defmultiply(self, x, y): return x * y
if __name__ == '__main__': calculator = Calculator() fire.Fire(calculator)
暴露类(class)中的多个函数
Fire也适用于class。 这是暴露多个命令的另一个好的做法。
1 2 3 4 5 6 7 8 9 10 11
import fire classCalculator(object): defadd(self, x, y): return x + y defmultiply(self, x, y): return x * y
if __name__ == '__main__': fire.Fire(Calculator) python example.py multiply 1020 200
为什么要用类呢,因为这样你可以给构造类传递参数__init_函数的参数必须用--flag语法传递:
1 2 3 4 5 6 7 8 9 10 11
import fire classtest(object): def__init__(slelf,name=''):#加这个主要是为了如果没有输入的情况下给个默认值 slelf.name=name defpr(self): print('name is '+self.name) if __name__ == '__main__': fire.Fire(test) >python first.py pr --name=QIN >name is QIN
因为在主函数里面还没有实例化,因此相当于可以自己改变类的参数。
Ⅳ.带*args和**kwargs的函数
同一个类内
1 2 3 4 5 6 7 8 9
import fire deftest(*args): sort=sorted(args,key=lambda num: num)#这个写法挺有趣 # print(args) return(sort) if __name__ == '__main__': fire.Fire(test) >python first.py 4561245057855 >8125557450456
$ python example.py dog cat elephant - upper CAT DOG ELEPHANT 12
如果没有分隔符,upper就会被当作另一个参数。
1 2
$ python example.py dog cat elephant upper cat dog upper elephant
不同类内(GAN代码所用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
import fire classConfig(object): name='NULL' age=0 add=('sc','cd') opt=Config()
deftest(**kwargs): for k_, v_ in kwargs.items():#这个写法非常重要!!! # print(k_,v_) setattr(opt, k_, v_) print('name is {},age is {} and address is {}.'.format(opt.name,opt.age,str(opt.add))) if __name__ == "__main__" : fire.Fire() >python first.py test --name=QIN --age=21 >name is QIN,age is21and address is ('sc', 'cd').
$ 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 12345678910