名前空間推測するコードを書いてみた

以前このようなツイートをしたのですが、調べていたら Python で書けそうだったので実際に書いてみました。

サンプルソース

サンプルソースとして FizzBuzz を解かせてみます。

A.py

#!/usr/bin/env python
def FizzBuzz(n):
    if n % 3 and n % 5:
        return str(n)
    return ''

B.py

#!/usr/bin/env python
def FizzBuzz(n):
    if n % 3 == 0:
        return 'Fizz'
    return ''

C.py

#!/usr/bin/env python
def FizzBuzz(n):
    if n % 5 == 0:
        return 'Buzz'
    return ''

fizzbuzz.py

#!/usr/bin/env python

from nsinf import At

import A
import B
import C

if __name__ == '__main__':
    for i in xrange(20):
        texts = At(' FizzBuzz')(i)
        print ''.join(texts)

端末

$ python fizzbuzz.py
1
2
Fizz
4
Buzz
Fizz
...

動作の順序としては

  1. オブジェクトの木構造を取得します
  2. 指定したパスにマッチするオブジェクトを拾います
  3. 関数呼び出しでは該当した全ての関数の呼び出しを試みます

という感じです。

単一のソースコードでも動きます。
http://ideone.com/okTyK