class Python::PyObject
Public Class Methods
new(attr={})
click to toggle source
# File lib/python/pyobject.rb, line 3 def initialize(attr={}) self.merge!(attr) end
Public Instance Methods
base_traverse(&proc)
click to toggle source
# File lib/python/pyobject.rb, line 105 def base_traverse(&proc) queue = [self] until queue.empty? cls = queue.pop if judge = proc.call(cls) return cls end queue += (cls[:bases] || []) end return nil end
call(*args)
click to toggle source
# File lib/python/pyobject.rb, line 15 def call(*args) if self[:entity] && self[:entity].is_a?(Proc) self[:entity].call(*args) else call_special_method("__call__", *args) end end
call_special_method(method_name, *args)
click to toggle source
# File lib/python/pyobject.rb, line 23 def call_special_method(method_name, *args) get_special_attr(method_name).call(*args) end
datadescriptor?()
click to toggle source
# File lib/python/pyobject.rb, line 101 def datadescriptor? descriptor? && self[:class].base_traverse{|cls| cls["__set__"] || cls["__delete__"]} end
descriptor?()
click to toggle source
# File lib/python/pyobject.rb, line 88 def descriptor? self[:class] && self[:class].base_traverse{|cls| cls["__get__"]} end
entity()
click to toggle source
# File lib/python/pyobject.rb, line 11 def entity self[:entity] end
get_attr(name)
click to toggle source
# File lib/python/pyobject.rb, line 49 def get_attr(name) if !self[:class] raise "failed to get attr #{name} from #{self}: #{self} doesn't have class" elsif cls = self[:class].base_traverse{|cls| cls[name] && cls[name].datadescriptor?} cls[name].get_get_method.call(cls[name], self, self[:class]) elsif owner = self.base_traverse{|owner| owner[name]} owner[name] elsif cls = self[:class].base_traverse{|cls| cls[name]} if cls[name].descriptor? cls[name].get_get_method.call(cls[name], self, self[:class]) else cls[name] end else raise "failed to get attr #{name} from #{self}: #{name} is not found" end end
get_get_method()
click to toggle source
# File lib/python/pyobject.rb, line 83 def get_get_method cls = self[:class].base_traverse{|cls| cls["__get__"]} cls["__get__"] end
get_set_method()
click to toggle source
# File lib/python/pyobject.rb, line 92 def get_set_method cls = self[:class].base_traverse{|cls| cls["__set__"] || cls["__delete__"]} unless cls["__set__"] raise "cannot set data on datadescriptor '#{cls}'" else cls["__set__"] end end
get_special_attr(name)
click to toggle source
# File lib/python/pyobject.rb, line 27 def get_special_attr(name) if !self[:class] raise "failed to get special attr #{name} from #{self}: #{self} doesn't have class" elsif cls = self[:class].base_traverse{|cls| cls[name] && cls[name].datadescriptor?} cls[name].get_get_method.call(cls[name], self, self[:class]) elsif cls = self[:class].base_traverse{|cls| cls[name]} if cls[name].descriptor? cls[name].get_get_method.call(cls[name], self, self[:class]) else cls[name] end else raise "failed to get special attr #{name} from #{self}: #{name} is not found" end end
has_attr?(name)
click to toggle source
# File lib/python/pyobject.rb, line 67 def has_attr?(name) get_attr(name) rescue nil end
has_special_attr?(name)
click to toggle source
# File lib/python/pyobject.rb, line 43 def has_special_attr?(name) get_special_attr(name) rescue nil end
inspect()
click to toggle source
Calls superclass method
# File lib/python/pyobject.rb, line 117 def inspect if self[:name] self[:name] elsif self[:entity] self[:entity].to_s elsif self[:class] && self[:class][:name] "<instance of:#{self[:class][:name]}" else super end end
make_instance(entity=nil, &entity_proc)
click to toggle source
# File lib/python/pyobject.rb, line 7 def make_instance(entity=nil, &entity_proc) PyObject.new(:class => self, :entity => entity || entity_proc) end
set_attr(name, pyobj)
click to toggle source
# File lib/python/pyobject.rb, line 73 def set_attr(name, pyobj) if !self[:class] raise "failed to set attr #{name} on #{self}: #{self} doesn't have class" elsif cls = self[:class].base_traverse{|cls| cls[name] && cls[name].datadescriptor?} cls[name].get_set_method.call(cls[name], self, pyobj) else self[name] = pyobj end end