使用ast从python到ruby的代码转换器
py2rb的Python项目详细描述
从python到ruby使用ast的代码转换器。 这基本上是一个具有ruby输出的nodevisitor。 有关详细信息,请参阅ast文档(https://docs.python.org/3/library/ast.html)。
安装
执行以下操作:
pip install py2rb or git clone git://github.com/naitoh/py2rb.git
依赖关系
- Python3.5,3.6
- Ruby 2.4或更高版本
用法
示例1:
$ cat tests/basic/oo_inherit_simple.py class bar(object): def __init__(self,name): self.name = name def setname(self,name): self.name = name class foo(bar): registered = [] def __init__(self,val,name): self.fval = val self.register(self) self.name = name def inc(self): self.fval += 1 def msg(self, a=None, b=None, c=None): txt = '' varargs = a, b, c for arg in varargs: if arg is None: continue txt += str(arg) txt += "," return txt + self.name + " says:"+str(self.fval) @staticmethod def register(f): foo.registered.append(f) @staticmethod def printregistered(): for r in foo.registered: print(r.msg()) a = foo(10,'a') a.setname('aaa') b = foo(20,'b') c = foo(30,'c') a.inc() a.inc() c.inc() print(a.msg()) print(b.msg()) print(c.msg(2,3,4)) print("---") foo.printregistered()
以上结果将导致
$ py2rb tests/basic/oo_inherit_simple.py class Bar def initialize(name) @name = name end def setname(name) @name = name end end class Foo < Bar def method_missing(method, *args) self.class.__send__ method, *args end @@registered = [] def initialize(val, name) @fval = val Foo.register(self) @name = name end def inc() @fval += 1 end def msg(a: nil, b: nil, c: nil) txt = "" varargs = [a, b, c] for arg in varargs if arg === nil next end txt += arg.to_s txt += "," end return ((txt + @name) + " says:") + @fval.to_s end def self.register(f) @@registered.push(f) end def self.printregistered() for r in @@registered print(r.msg()) end end def self.registered; @@registered; end def self.registered=(val); @@registered=val; end def registered; @registered = @@registered if @registered.nil?; @registered; end def registered=(val); @registered=val; end end a = Foo.new(10, "a") a.setname("aaa") b = Foo.new(20, "b") c = Foo.new(30, "c") a.inc() a.inc() c.inc() print(a.msg()) print(b.msg()) print(c.msg(a: 2, b: 3, c: 4)) print("---") Foo.printregistered()
示例2:
$ cat tests/deep-learning-from-scratch/and_gate.py # coding: utf-8 import numpy as np def AND(x1, x2): x = np.array([x1, x2]) w = np.array([0.5, 0.5]) b = -0.7 tmp = np.sum(w*x) + b if tmp <= 0: return 0 else: return 1 if __name__ == '__main__': for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]: y = AND(xs[0], xs[1]) print(str(xs) + " -> " + str(y))
以上结果将导致
$ py2rb tests/deep-learning-from-scratch/and_gate.py require 'numo/narray' def AND(x1, x2) x = Numo::NArray.cast([x1, x2]) w = Numo::NArray.cast([0.5, 0.5]) b = -0.7 tmp = ((w * x).sum()) + b if tmp <= 0 return 0 else return 1 end end if __FILE__ == $0 for xs in [[0, 0], [1, 0], [0, 1], [1, 1]] y = AND(xs[0], xs[1]) print((xs.to_s + (" -> ")) + y.to_s) end end
示例3(转换指定python文件的所有本地相关模块文件):
$ git clone git://github.com/chainer/chainer.git $ py2rb chainer/chainer/__init__.py -m -p chainer -r -w -f Try : chainer/chainer/__init__.py -> chainer/chainer/__init__.rb : [OK] Warning : yield is not supported : Warning : yield is not supported : Try : chainer/chainer/configuration.py -> chainer/chainer/configuration.rb : [Warning] Try : chainer/chainer/cuda.py -> chainer/chainer/cuda.rb : [OK] : : Try : chainer/chainer/utils/array.py -> chainer/chainer/utils/array.rb : [OK]
测试
$./run_tests.py
将运行所有的测试,这应该是有效的。如果任何测试失败,那就是一个bug。
$./run_tests.py-a
将运行所有测试,包括已知失败的测试(当前)。它 应该可以从输出中理解。
$/运行测试.py-x 或 $./run_tests.py–无错误
将运行测试,但在测试引发错误时忽略。这不是 影响由测试目录中的测试文件生成的错误。
有关更多标志,请参见此处的说明
/run_tests.py-h
许可证
麻省理工学院,请参阅许可证文件以获取详细信息。