我想在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¶m1=value1¶m2=value2¶m3&
我的想法是写一个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/
至少,您可以签出代码的副本并获得一些想法。