```ruby
module PyCall
  class Tuple
    include PyObjectWrapper

    def self.new(init)
      case init
      when Integer
        super(LibPython.PyTuple_New(init))
      when Array
        tuple = new(init.length)
        init.each_with_index do |obj, index|
          tuple[index] = obj
        end
        tuple
      when PyObject
        super(init)
      end
    end

    # Make tuple from array
    def self.[](*ary)
      new(ary)
    end

    def initialize(pyobj)
      super(pyobj, LibPython.PyTuple_Type)
    end

    def length
      LibPython.PyTuple_Size(__pyobj__)
    end

    def [](index)
      LibPython.PyTuple_GetItem(__pyobj__, index).to_ruby
    end

    def []=(index, value)
      value = Conversions.from_ruby(value)
      LibPython.PyTuple_SetItem(__pyobj__, index, value)
    end
  end
end
```

Support to_a and to_ary in PyCall::Tuple
user
```ruby
module PyCall
  class Tuple
    include PyObjectWrapper

    def self.new(init)
      case init
      when Integer
        super(LibPython.PyTuple_New(init))
      when Array
        tuple = new(init.length)
        init.each_with_index do |obj, index|
          tuple[index] = obj
        end
        tuple
      when PyObject
        super(init)
      end
    end

    # Make tuple from array
    def self.[](*ary)
      new(ary)
    end

    def initialize(pyobj)
      super(pyobj, LibPython.PyTuple_Type)
    end

    def length
      LibPython.PyTuple_Size(__pyobj__)
    end

    def [](index)
      LibPython.PyTuple_GetItem(__pyobj__, index).to_ruby
    end

    def []=(index, value)
      value = Conversions.from_ruby(value)
      LibPython.PyTuple_SetItem(__pyobj__, index, value)
    end

    def to_a
      [].tap do |ary|
        i, n = 0, length
        while i < n
          ary << self[i]
          i += 1
        end
      end
    end

    alias to_ary to_a
  end
end
```
assistant