在django中实现类似rails的binding,ipython比pry好用的地方
分类:高并发

python的shell工具有个大名鼎鼎的ipython,ruby也出了一个shell工具,并且带语法高亮,如同ruby社区的其它产品,一如既往的炫。本想用pry代替ipython做系统管理操作,但发现pry相比ipython有个致命的缺陷

rails的binding.pry调试很爽,在刷新网页的时候直接进入代码内部还原现场,直接查看、操作上下文的对象。其实python社区也有相应的实现,以django为例,在代码中插入:

最近在学习ruby的过程遇到很多有趣的博客,随记录学习,这篇学习笔记摘自

在交互式shell中有时候需要修改前面定义的一个代码块,比如一个函数、一个循环体,就拿函数来作例子吧。

import IPython
IPython.embed()

#self

ruby中self无处不在,或是显示的调用或是隐含调用,方法调用如果不指明接收者,那么默认也是self。打开pry

ruby --version => ruby 2.4.0p0

p self                      => mainclass Persion  p self                     => Persion  def hello(param = ;endendPersion.new.hello       => #<Persion:0x007ff03d3b5468>class Manager  class Employ < (p self; self) => Manager  endend

在ipython中定义一个函数是这样的

以如下代码为例:

#default definee

ruby 中默认存在一个指向 class 的引用,不像 self可以随处调用,这个引用比 self 更加隐含,暂且称之为 default definee, 如果方法定义时不提供默认的接受者,那么方法默认就会作为 default definee 的实例方法,代开pry

def hello;endObject.instance_method => #<UnboundMethod: Object#hello>class Persion  def hello;endendPersion.instance_method => #<UnboundMethod: Persion#hello>

在正常的方法体内(def 定义的方法), self 是方法的接受者,但是内部函数的 default deinee 却是外层的class,例如:

class Persion   def hello     def speak;end   end endp = Persion.newp.hellop.method => #<Method: Persion#hello>Persion.instance_method => #<UnboundMethod: Persion#speak>

如果方法内部想要定义实例方法可以用self,本质上方法会被添加到对象的单例类上

class Persion   def hello     def self.speak;end   end endp = Persion.newp.hellop.method => #<Method: Persion#hello>p.method => #<Method: #<Persion:0x007fc5fe1cfe00>.speak>p.singleton_class.instance_method => #<UnboundMethod: #<Class:#<Persion:0x007fc5fe1cfe00>>#speak>

正常方法体内的 default definee 都是外层的class

class Manager;end$m = Manager.new => #<Manager:0x007f890e474958>class Employee  def $m.hello(param = (def speak;end))    def sing;end  endend$m.helloEmployee.instance_method => #<UnboundMethod: Employee#speak>Employee.instance_method  => #<UnboundMethod: Employee#sing>$m.method => NameError: undefined method `speak' for class `#<Class:#<Manager:0x007f890e474958>>'

Screenshot.png (上传于2012-11-19 21:55:36)
图片 1

def lists(request):
    text = '哈哈嘻嘻12'
    import IPython     //插入这两行
    IPython.embed()    //插入这两行
    return render(request, 'question/lists.html', locals())

# eval

如果想修改这个函数,按向上箭头,则

刷新网页的时候就会在插入的代码处停住进入ipython交互环境,如下图:

# instance_eval

instacne_eval 会执行以下操作:

  • 修改 self 为 instance_eval 的接受者
  • 修改 default definee 为 instance_eval 的单例类
o = Object.newo.instance_eval do  p self  def hello; endendo.method => #<Method: #<Object:0x007f890ec8e698>.hello>o.singleton_class.instance_method => #<UnboundMethod: #<Class:#<Object:0x007f890ec8e698>>#hello>

下一个例子

class Persion  $o = Object.new  $o.instance_eval do    def hello(param = (def speak;end))      def sing;end    end  endend$o.hello$o.method => #<Method: #<Object:0x007fee5f3f4b98>.speak>$o.method => #<Method: #<Object:0x007fee5f3f4b98>.sing>Persion.instance_method => NameError: undefined method `hello' for class `Persion'Persion.instance_method => NameError: undefined method `speak' for class `Persion'Persion.instance_method =>NameError: undefined method `sing' for class `Persion'$o.singleton_class.instance_method => #<UnboundMethod: #<Class:#<Object:0x007fee5f3f4b98>>#hello>$o.singleton_class.instance_method => #<UnboundMethod: #<Class:#<Object:0x007fee5f3f4b98>>#speak>$o.singleton_class.instance_method => #<UnboundMethod: #<Class:#<Object:0x007fee5f3f4b98>>#sing>

Screenshot-1.png (上传于2012-11-19 21:55:36)
图片 2

屏幕快照 2015-09-05 13.56.07.png (上传于2015-09-05 13:56:47)
图片 3

# class_eval

class_eval 会把 self 和 default definee 都修改为class_eval 的接受者

class Persion;endPersion.class_eval do  p self           => Persion  def hello; endendPersion.new.method => #<Method: Persion#hello>Persion.instance_method => #<UnboundMethod: Persion#hello>

明白了以上几点,那么下面这个例子就很好理解了:

Persion.instance_eval { define_method { "hello" } }Persion.class_eval { define_method { "sing" } }Persion.instance_eval { def speak; 'speak'; end }Persion.class_eval { def dance; 'dance'; end }p Persion.new.hello => "hello"p Persion.new.sing  => "sing"p Persion.speak.    => "speak"p Persion.new.dance => "dance"

出现整个函数体,修改的时候很方便吧

在pry中定义一个函数是这样的

Screenshot-2.png (上传于2012-11-19 21:55:36)
图片 4

炫,颜色炫的恰到好处

如果想修改这个函数,按向上箭头

Screenshot-3.png (上传于2012-11-19 21:55:36)
图片 5

只出来一个end,刚刚定义的函数体的最后一行

再按向上箭头

Screenshot-4.png (上传于2012-11-19 21:55:36)
图片 6

再按

Screenshot-5.png (上传于2012-11-19 21:55:36)
图片 7

看出来pry跟ipython的差距了吧图片 8

本文由10bet手机官网发布于高并发,转载请注明出处:在django中实现类似rails的binding,ipython比pry好用的地方

上一篇:SMC双杆气缸CXSM20,中国音协2015年音乐考级桂林考点电子琴考级成绩 下一篇:没有了
猜你喜欢
热门排行
精彩图文