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

mallon 发布于 2014/08/14 20:35
阅读 874
收藏 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

一由一篇技术分享http://www.oschina.net/question/220339_164960引发的血案,@乌龟壳@习总@索隆@中山野鬼

当前这篇是@mallon写的,由于OSC是技术圈,希望各位指点下关于”插件“的使用。

乌龟壳
乌龟壳
怎么做都可以
Tek_Eternal
Tek_Eternal
支持理性的技术pk:)
mallon
mallon
血案...
0
中山野鬼
中山野鬼

引用来自“Xsank”的评论

一由一篇技术分享http://www.oschina.net/question/220339_164960引发的血案,@乌龟壳@习总@索隆@中山野鬼

当前这篇是@mallon写的,由于OSC是技术圈,希望各位指点下关于”插件“的使用。

python不搞这么复杂的东西。不过最近正在用c实现组件式的应用系统架构。其实名字这么叫过于扯淡。哈。但是圈外人被诸如埃森哲忽悠的soa太厉害。我要和他们说,“其实就是个后台守护进程,管理多层的进程组,搞个共享内存空间,对单一功能进程可以释放后,再动态加载,统一数据接口,每个功能进程定义服务和资源依赖,由守护进程根据动态的业务处理流程资源依赖表,将多个功能进程做作业化及调度。”估计还没说一半,就顿时没人了。哈。
0
Jeky
Jeky
既然使用的语言能支持传递函数,为什么还要用蛋疼的类+继承来搞,支持这个更Pythonic
0
notvue
notvue

菜鸟 路过

0
0
去开原
去开原
我发现你这个人真能装逼,不就写两行代码么,还什么mother fucker,真败rp
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的代码,写代码不是应试教育。关于我之前发表的帖子,他有他的适用场景,至于你写的这篇,如果就这点内容就拿出来说教育我的话,我觉得还不够说服力,当然但凡谁觉得有用,这个讨论终归是有点益处的

孺子刚愎自用,不可教也!
返回顶部
顶部