教教你什么是pythonic的插件写法

mallon 发布于 2014/08/14 20:35
阅读 1K+
收藏 2

开源之夏第三届火热来袭,高校学生参与赢万元奖金!>>>

@Xsank

plugins.py

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""

"""
__author__ = 'Mallon'
__version__ = ''


def plugin_1(*args, **kwargs):
    print('This is plugin 1, %s, %s' % (args, kwargs))


def plugin_2(*args, **kwargs):
    print('This is plugin 2, %s, %s' % (args, kwargs))



plugin_call.py

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""

"""
__author__ = 'Mallon'
__version__ = ''


def call_plugin_by_name(module_name, func_name, *args, **kwargs):
    return (getattr(__import__(module_name), func_name))(*args, **kwargs)


if __name__ == '__main__':
    call_plugin_by_name('plugins', 'plugin_1', 1, False, 'Hello')
    call_plugin_by_name('plugins', 'plugin_2', pi=3.14, mother='fucker')



加载中
0
Xsank
Xsank
该评论暂时无法显示,详情咨询 QQ 群:点此入群
乌龟壳
乌龟壳
怎么做都可以
Tek_Eternal
Tek_Eternal
支持理性的技术pk:)
mallon
mallon
血案...
0
中山野鬼
中山野鬼
该评论暂时无法显示,详情咨询 QQ 群:点此入群
0
Jeky
Jeky
既然使用的语言能支持传递函数,为什么还要用蛋疼的类+继承来搞,支持这个更Pythonic
0
不再使用了了65535
不再使用了了65535
该评论暂时无法显示,详情咨询 QQ 群:点此入群
0
0
去开原
去开原
该评论暂时无法显示,详情咨询 QQ 群:点此入群
0
Xsank
Xsank

@中山野鬼 还是一贯的嬉皮士风格。。。

@Jeky@mallon ,不要随口说什么Pythonic,你们心中的pythonic是什么样的,欢迎晒一下你们pythonic的代码,写代码不是应试教育。关于我之前发表的帖子,他有他的适用场景,至于你写的这篇,如果就这点内容就拿出来说教育我的话,我觉得还不够说服力,当然但凡谁觉得有用,这个讨论终归是有点益处的

0
Jeky
Jeky

引用来自“Xsank”的评论

@中山野鬼 还是一贯的嬉皮士风格。。。

@Jeky@mallon ,不要随口说什么Pythonic,你们心中的pythonic是什么样的,欢迎晒一下你们pythonic的代码,写代码不是应试教育。关于我之前发表的帖子,他有他的适用场景,至于你写的这篇,如果就这点内容就拿出来说教育我的话,我觉得还不够说服力,当然但凡谁觉得有用,这个讨论终归是有点益处的

我觉得@mallon 写的就挺清楚了 你没细看而已
我根据你的代码再写一个版本好了

class PasswordValidator:
    
    def __init__(self):
        self.plugins = []


    def validate(self, pwd):
        for p in self.plugins:
            p(pwd)


def minimumLength(pwd):
    if len(pwd)<6:
        raise ValueError('Passwords must be at least 6 characters')


def specialCharacters(pwd):
    if pwd.isalnum():
        raise ValueError('Passwords must contain at least one special character')


if __name__ == '__main__':
    validator = PasswordValidator()
    validator.plugins.append(minimumLength)
    validator.plugins.append(specialCharacters)

    validator.validate('xxxxxx')

我这里是手动注册的,你也可以弄成自动注册。总之大意我基本表达清楚了。

(另外你那个specialCharacters显然逻辑有问题。)

Jeky
Jeky
回复 @Xsank : 本质上是函数,就用函数,没必要弄一个类来描述。这个还真不是用哪种都可以或者看场景。Java的那些是没办法。我看原帖有人推荐你看Django代码,那个真心不错,你慢慢看。
Xsank
Xsank
如@乌龟壳说的,怎么做都可以。 我之前发的帖子,除了插件在继承的时候自动注册部分外和你贴的代码没有区别,不过从回复看来大家主要是特别反感继承这部分的实现,虽然我还是觉得没什么不好;使用动态引入和反射也可以达到配置插件的效果,至于非说哪一种好,我觉得看场景吧
0
明月照大江
明月照大江
我来围观的
0
mallon
mallon

引用来自“Xsank”的评论

@中山野鬼 还是一贯的嬉皮士风格。。。

@Jeky@mallon ,不要随口说什么Pythonic,你们心中的pythonic是什么样的,欢迎晒一下你们pythonic的代码,写代码不是应试教育。关于我之前发表的帖子,他有他的适用场景,至于你写的这篇,如果就这点内容就拿出来说教育我的话,我觉得还不够说服力,当然但凡谁觉得有用,这个讨论终归是有点益处的

孺子刚愎自用,不可教也!
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部
返回顶部
顶部