使用具有额外参数的python模块覆盖python模块 - python

时间:2017-10-15 00:57:51

标签: python python-3.x tweepy

我已经导入了一个很酷的包(如果它很重要,它叫做tweepy)。

但由于Twitter最近的变化,其中2种方法存在一个小的限制。已经有一个修复但它已经拉了一段时间了

我正在考虑暂时添加修复程序并覆盖现有模块,直到更新程序包,尽管我对python不太熟悉

def statuses_lookup(self, id_, include_entities=None,
                    trim_user=None, map_=None):
    return self._statuses_lookup(list_to_csv(id_), include_entities,
                                 trim_user, map_)

@property
def _statuses_lookup(self):
    """ :reference: https://dev.twitter.com/rest/reference/get/statuses/lookup
        :allowed_param:'id', 'include_entities', 'trim_user', 'map'
    """
    return bind_api(
        api=self,
        path='/statuses/lookup.json',
        payload_type='status', payload_list=True,
        allowed_param=['id', 'include_entities', 'trim_user', 'map'],
        require_auth=True
    )

并用类似的方法覆盖它(据我所知,差异是添加额外的参数tweet_mode):

def statuses_lookup(self, id_, include_entities=None,
                    trim_user=None, map_=None, tweet_mode=None):
    return self._statuses_lookup(list_to_csv(id_), include_entities,
                                 trim_user, map_, tweet_mode)

@property
def _statuses_lookup(self):
    """ :reference: https://dev.twitter.com/rest/reference/get/statuses/lookup
        :allowed_param:'id', 'include_entities', 'trim_user', 'map', 'tweet_mode'
    """
    return bind_api(
        api=self,
        path='/statuses/lookup.json',
        payload_type='status', payload_list=True,
        allowed_param=['id', 'include_entities', 'trim_user', 'map', 'tweet_mode'],
        require_auth=True
    )

我之前从未在python 3.X中尝试过类似的东西

2 个答案:

答案 0 :(得分:1)

一切都是可行的。

这是关于如何破解课程的简化解决方案。即使导入了模块,并且该类用于创建对象 - 这个hack会立即影响所有现有对象:

class KLS(object):
    @property
    def x(self):
        print('OLD')
        return 100

def new_function(self):
    print('NEW')
    return 200

obj = KLS()

print(obj.x)  # OLD + 100    
KLS.x = property(new_function)  # <-- HACK!
print(obj.x)  # NEW + 200

该解决方案适用于py2和amp; PY3。

但是,请确保原始类中没有该属性的setter / deleters(即,它是可设置的还是只读?)对于setter,您必须调用property(getter_func, setter_func)。< / p>

答案 1 :(得分:0)

在这种情况下,实现的最佳方式是从原始对象扩展并覆盖您想要的内容:

class CustomAPI(API):
    def statuses_lookup(self, id_, include_entities=None,
                    trim_user=None, map_=None, tweet_mode=None):
        return self._statuses_lookup(list_to_csv(id_), include_entities,
                                 trim_user, map_, tweet_mode)

    @property
    def _statuses_lookup(self):
        """ :reference: https://dev.twitter.com/rest/reference/get/statuses/lookup
            :allowed_param:'id', 'include_entities', 'trim_user', 'map', 'tweet_mode'
        """
        return bind_api(
            api=self,
            path='/statuses/lookup.json',
            payload_type='status', payload_list=True,
            allowed_param=['id', 'include_entities', 'trim_user', 'map', 'tweet_mode'],
            require_auth=True
        )

然后,您可以使用CustomAPI代替API

更新

假设您创建了一个新的custom_tweepy.py文件:

from tweepy import API

class CustomAPI(API):
    def statuses_lookup(self, id_, include_entities=None,
                    trim_user=None, map_=None, tweet_mode=None):
        return self._statuses_lookup(list_to_csv(id_), include_entities,
                                 trim_user, map_, tweet_mode)

    @property
    def _statuses_lookup(self):
        """ :reference: https://dev.twitter.com/rest/reference/get/statuses/lookup
            :allowed_param:'id', 'include_entities', 'trim_user', 'map', 'tweet_mode'
        """
        return bind_api(
            api=self,
            path='/statuses/lookup.json',
            payload_type='status', payload_list=True,
            allowed_param=['id', 'include_entities', 'trim_user', 'map', 'tweet_mode'],
            require_auth=True
        )

然后,您最初使用的其他地方from tweepy import API,您可以将其替换为from custom_tweepy import CustomAPI as API。接下来,您可以使用自定义API实现。并且,您只需覆盖这两个函数,以便所有其他函数都不会更改。