理解 Python 中的 *args 和 **kwargs

Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如:

def test_defargs(one, two = 2):
   print 'Required argument: ', one
   print 'Optional argument: ', two

test_defargs(1)
# result:
# Required argument: 1
# Optional argument: 2

test_defargs(1, 3)
# result:
# Required argument: 1
# Optional argument: 3

当然,本文章的主题并不是讲默认参数,而是另外一种达到可变参数 (Variable Argument) 的方法:使用*args和**kwargs语法。其中,*args是可变的positional arguments列表,**kwargs是可变的keyword arguments列表。并且,*args必须位于**kwargs之前,因为positional arguments必须位于keyword arguments之前。

查看全文

PySqlite 学习笔记

这是一篇老笔记,原来是放在旧博客上的,最近因为公司内部一个小东西,想使用简单点的数据库来存储数据,就想起用SQLite来做,上网搜索一些教程。竟然发现,原来一年多前,我也学过一阵子,可惜因为不常用,现在已经基本忘记光光了,加上自己对数据库向来不是非常熟悉,就特地放到新博客上,顺便回顾一下。

这篇笔记的主要内容来源于python之sqlite3使用详解PySqlite简明教程

SQlite这个小型数据库,经常在Firefox或者其它软件中看到,它貌似没有独立的维护进程,而是把所有数据都存放在一个单独的文件中。上网搜了下资料,看了看Python上的pysqlite模块,它正是Python中对sqlite的封装实现。

数据库操作

Python的数据库模块都有统一的接口标准,所以数据库操作都基本上是统一的,基本上分成以下几步(假设数据库模块为db):

  1. 用db.connect()创建数据库连接,连接对象为conn。
  2. 如果不需要返回查询结果,就直接调用conn.execute()。
  3. 如果需要返回查询结果,则需要首先通过conn.cursor()创建游标对象cur,并使用cur.fetchone()等函数获取查询结果。
  4. 根据数据库隔离级别的不同,修改数据库后,可能需要使用conn.commit()手动提交事务。
  5. 调用相应的close()方法关闭cur及conn。

查看全文

恢复复制功能脚本

有些网站(例如起点等)为了版权问题而禁用了右键复制的功能,甚至替换了右键菜单(例如起点),这个脚本的作用就是为了重新恢复禁用的复制功能(当然可以扩展其它功能,比如恢复右键菜单)。这个脚本的初衷是,我在准备驾校理论考的时候,在tieba.jxydt.com查找信息并且做笔记的时候,却发现该网站禁用了复制功能,那时候非常无奈,就开始动手写这个脚本,后来为了考虑一些扩展性,添加、封装了一些代码。

总体来说,这个脚本的扩展性还是可以的。可以非常方便的添加更多需要恢复复制功能的网站,但是我个人不是非常满意,觉得有些地方代码有点臃肿了。当然后期的进一步完善,还是需要更多朋友提供建议和反馈。脚本目前支持Firefox和Chrome,其它浏览器未测试。

最新版的代码可以在UserScripts.org下载:地址

原理很简单,无非是找到相关的页面元素,删除或者替换与复制相关的事件,例如oncopy/onselectstart/oncontextmenu/onmousedown等等。如果有一点JavaScript代码的基础,可以参考脚本中已有的网站支持的代码添加新站点支持。不然你可以在这里留言,我会帮你添加。

查看全文

博客添加回到顶部按钮

博客的文章往往篇幅比较长,如果访客要访问博客的其它文章(例如通过侧栏的Widgets访问相关的文章)就需要滚动鼠标,移动到页面的头部。比较人性的一个设计是,在页面的底部(或者中靠近下的位置)添加一个“回到页面顶部”的按钮,可以快速定位到文章的顶部位置。

这个功能设计起来不难,可以采用如一文中提到的锚链接形式,例如回到顶部按钮是一个链接:

<a href="#top">Top</a>

将其放到页面底部,点击该链接可以直接定位到页面顶部。但是如果我们不希望用链接来实现呢,而是模拟一个按钮(用span),并且希望按下回到顶部按钮的时候,可以比较平滑地回到顶部,那该怎么做呢?代码非常简单,这里只用到些许的CSS样式以及jQuery代码。

首先在在文章页面body底部添加以下代码(index.php或者single.php):

<span id="back-to-top">Top</span>

为了方便起见,以上按钮的代码在jQuery中创建添加,不需要手动去修改php文件。同时,利用jQuery完成按钮的行为,主要通过监听window的onscroll事件,当滚动距页面顶部超过100px的时候,淡入显示按钮。当滚动距页面顶部少于100px的时候,淡出隐藏按钮。使用jQuery的animate函数,可以实现平滑地滚动效果(利用document.body或者document.documentElement的scrollTop属性完成动画效果)。

添加的jQuery代码如下所示:

/* Add a back to top button */
function back_to_top()
{
    /* Cache back-to-top button object */
    var $top = $('<span id="back-to-top">Top</span>').appendTo('body');

    /* Cross-browser compatible in scrollTop */
    var $body = (!window.opera) ? $('html, body') : (document.compatMode == 'CSS1Compat'
        ? $('html') : $('body'));

    if ($top.length == 0)
         return;
 
    /* Hide back-to-top button at first */
    $top.hide();
 
    /* Fade in back-to-top button when need */
    $(window).scroll(function () {
        if ($(this).scrollTop() > 100) {
            $top.fadeIn();
        } else {
            $top.fadeOut();
        }
    });
 
    /* Scroll to top when click back-to-top button */
    $top.click(function () {
        $body.animate({ scrollTop: 0 }, 800);
    });
}

back_to_top();

同时在博客样式(style.css)中添加以下自定义的样式内容:

#back-to-top {
    background-color: #F5F5F5;
    bottom: 0;
    box-shadow: 0 0 6px #808080;
    color: #444444;
    padding: 5px 10px;
    position: fixed;
    right: 50px;
    cursor: pointer;
}

这里将按钮固定定位到(position: fixed)页面右下角,并且添加边框阴影等效果。

最后附上一段区分外部链接的代码片断(摘自Learning jQuery 3rd edition)

    /* Add tag next to the external link */
    $('.column .post-entry a').not(':has(img)').filter(function() {
        return this.hostname && this.hostname != location.hostname;
    }).addClass('external').attr('target', '_blank');