十月 6, 2008
» ABCs from Python 2.6 to 2.5

把玩 Command Pattern 時用到的:
# CommandExample.py

try:
  from abc import ABCMeta, abstractmethod
except ImportError, e:
  class ABCMeta(type):
    pass
  def abstractmethod(f):
    def raiseNotImp(f):
      raise NotImplementedError(repr(f))
    return raiseNotImp

class Command(object):
  __metaclass__ = ABCMeta

  @abstractmethod
  def execute(self): pass

class NotImpExeCmd(Command): pass

class ImpExeCmd(Command):
  def execute(self): print "Hi! I'm executed."

def executed_or_error(name, ExeCmdClass):
  try:
    Cmd = ExeCmdClass()
    Cmd.execute()
  except Exception, e:
    print repr(e)
  else:
    print name, 'is executed. Really.'

executed_or_error('Command',      Command      )
executed_or_error('NotImpExeCmd', NotImpExeCmd )
executed_or_error('ImpExeCmd',    ImpExeCmd    )

Demo:
% python2.5 CommandExample.py
NotImplementedError('<__main__.Command object at 0xb7dbf88c>',)
NotImplementedError('<__main__.NotImpExeCmd object at 0xb7dbf8cc>',)
Hi! I'm executed.
ImpExeCmd is executed. Really.

% python2.6 CommandExample.py
TypeError("Can't instantiate abstract class Command with abstract methods execute",)
TypeError("Can't instantiate abstract class NotImpExeCmd with abstract methods execute",)
Hi! I'm executed.
ImpExeCmd is executed. Really.

反證一下,把 @abstractmethod 那行註解掉,用 python2.5 或 2.6 都得到以下結果:
Command is executed. Really.
NotImpExeCmd is executed. Really.
Hi! I'm executed.
ImpExeCmd is executed. Really.

不過最直接的方法呢,就是決定到底要用 2.5 還是 2.6 來寫。(茶)

Update @2008-10-06 :
看來這裡我的 monkey patch 還是沒 2.6 來的漂亮,實際上 trace code 的情況:

Traceback (most recent call last):
File "Command.py", line 44, in
t = TestCmd()
TypeError: Can't instantiate abstract class TestCmd with abstract methods execute
2.6 的 abc 是在生成 Class 時即丟出錯誤訊息,而我的用法只能在
Traceback (most recent call last):
File "Command.py", line 45, in
t.execute()
File "/home/keitheis/Conquer/PySys/abc.py", line 10, in raiseNotImp
raise NotImplementedError(repr(f))
NotImplementedError: <__main__.TestCmd object at 0xb7ce2acc>
執行 execute() 時才丟出錯誤。還是用簡單直覺的方法解決問題吧。

三月 9, 2007
» On Intelligence

上週四(6/15)經過書街,不小心發現此書,瀏覽之下,驚為天人,二話不說,(當下放棄原本採購 LCD 螢幕的計畫)抱一本回去好好端詳先。 竟然還是洪蘭譯的。哎呀!怎麼以前沒發現這本?哦,原來是今年才上架的。雖稍感安慰,但內心還是怪自己太久沒 update 這方面的資訊了。 有趣的是,作者就是那位發明 PalmPilot 的 Jeff Hawkins;更讓人意外的,這本書還有 Watson 及 Kandel 這兩位諾貝爾生醫獎得主推薦。 註一:Watson 於 1953 年和 Crick 共同發現 DNA 雙螺旋結構,是上個世紀生物學最大的發現。 註二:Kandel 是神經科學的權威,也因為突觸變化的效應及其改變如何影響記憶及學習方面的研究,榮獲 2000 年的諾貝爾獎,他寫了幾本 Bible 級的書,跟人合著的《透視記憶》也很值得一讀。 註三:Crick

biggo.com.tw

A Django site.