1

flickr-APIの便利なインターフェイスを書きたいと思いますPython。API が提供するメソッド

flickr.galleries.addPhoto
flickr.galleries.create
flickr.cameras.getBrandModels
flickr.cameras.getBrands
etc.

のように、通常の http リクエストで使用されます

http://api.flickr.com/services/rest/?method=flickr.X&param1=value1&param2=value2&param3&

私のアイデアはclass flickr、Python で同じ構文でメソッドを呼び出すことができるようになる可能性がある を作成することでした。したがって、クラス flickr は、X=galleries.addPhoto呼び出し時に識別子にアクセスできるようにする必要があります

flickr.X(param1=value1,param2=value2)

getattr関数名をパラメータとして使用する関数を使用することを考えましたが、残念ながら失敗しました。

ドットを無視して X の名前にアクセスする方法はありますか?

Ps は、class flickrギャラリー、カメラなどの「名前空間」の正確な構造をチェック (または保持) しないでください。可能な限り一般的であり、メソッドの名前が将来変更されるため、影響を受けません。

4

2 に答える 2

0

すでに存在するPythonでflickr APIを試しましたか?

ここにカップルがあります:

少なくとも、コードのコピーをチェックアウトして、いくつかのアイデアを得ることができます。

于 2013-10-16T22:30:05.263 に答える
0

これまでのところ、Python 構文を拡張することをお勧めするかどうかはわかりませんが、getattrクラス メソッドは機能します。クラスの辞書にないメンバーにアクセスするたびに呼び出されるため、「X」がクラスメンバーではないことを確認し、代わりに「_X」などを使用してから、次のようなクラス構造を使用する必要があります。

class a(object):
    def _hi(self):
        print "hello"

    def __getattr__(self, val):
        a.__dict__["_" + val](self)

>>> b = a() 
>>> b.hi
hello

***編集: ドット構文の扱い

class A(object):
    def __init__(self, call_tree=None):
        self.call_tree = call_tree

    def __getattr__(self, val):
        if self.call_tree:
            new_call_tree = '.'.join([self.call_tree, val])
        else:
            new_call_tree = val
        return A(call_tree=new_call_tree)

    def __call__(self, *args, **kwargs):
        url = 'https://api.flickr.com/?function={}'.format(self.call_tree)
        print url

>>> b = A()
>>> b.hi.mom()
https://api.flickr.com/?function=hi.mom
>>> b.hi.dad()
https://api.flickr.com/?function=hi.dad
于 2013-10-16T22:32:15.730 に答える