1

我想为flickr-APIin编写一个方便的界面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 回答