使用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

许可证

麻省理工学院,请参阅许可证文件以获取详细信息。

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

推荐PyPI第三方库


热门话题
在java中将字符串转换为另一个字符串   我有一个功能模型(xml格式)。当遍历所需的特性时,是否有方法为任何给定的特性模型生成java类?   泛型如何在我自己的链表中将迭代器定义为Java中的节点?   Java Lucene对于同一Lucene查询语言,BooleanQuery和QueryParser查询的结果不同   java禁用REST安全性和身份验证Websphere Commerce   我如何访问本地。属性变量?Java Swing正确使用变量   使用Java 1.7为Kotlin配置Gradle   java如何将mvn项目分解为多模块?   java无与伦比的eclipse调试配置。如何删除?   java如何谷歌翻译API,当我尝试时没有提供正确的输出   java有没有更好的方法将变量传递给我的视图?   在变量Java Android中存储用户EditText中的编号   javaapachecamel当反序列化对象时,它抛出一个异常:com。fasterxml。杰克逊。果心JsonParseException:无法识别的令牌   java简单UI循环,找不到bug