滥用点语法,以方便方式访问 Python 中的 API



我想在Python中为flickr-API编写一个方便的界面。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 的名称而忽略点。

附言class flickr不应该检查(或持有)画廊、相机等"命名空间"的确切结构,以保持尽可能通用,并且不会受到影响,因为方法的名称将来会发生变化。

我不知道

我是否建议到目前为止扩展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

你有没有在python中尝试过已经存在的flickr API?

这是一对:

  • https://bitbucket.org/sybren/flickrapi/
  • http://code.google.com/p/flickrpy/
  • http://code.google.com/p/python-flickr-api/

至少,您可以签出代码的副本并获得一些想法。

最新更新