小编Ant*_*aux的帖子

字符串连接上的Python 3.6 vs 3.5 TypeError消息

'Hello ' + 1 在Python 3.5和3.6上没有返回相同的错误消息:

  • Python 3.5.2: TypeError: Can't convert 'int' object to str implicitly
  • Python 3.6.0: TypeError: must be str, not int

这是一个简单的措辞改变还是有更微妙的背后?

python string typeerror python-3.5 python-3.6

11
推荐指数
1
解决办法
648
查看次数

在进程池中共享数据库连接

我有一个 Python 3 程序,它根据行的 id(在 Postgres 9.5 数据库中的表中)更新一个大的行列表。

我使用多处理来加速这个过程。由于 Psycopg 的连接不能跨进程共享,我为每一行创建一个连接,然后关闭它。

总体而言,多处理比单处理快(8 个 CPU 时快 5 倍)。但是,创建连接很慢:我只想创建几个连接,并在需要时保持打开状态。

由于 .map() 将 ids_list 切割成多个块并提交给进程池,是否可以为同一块/进程中的所有 id 共享数据库连接?

示例代码:

from multiprocessing import Pool
import psycopg2


def create_db_connection():
    conn = psycopg2.connect(database=database,
                            user=user,
                            password=password,
                            host=host)
    return conn


def my_function(item_id):
    conn = create_db_connection()

    # Other CPU-intensive operations are done here

    cur = conn.cursor()
    cur.execute("""
        UPDATE table
        SET
        my_column = 1
        WHERE id = %s;
        """,
        (item_id, ))
    cur.close()
    conn.commit()


if __name__ == '__main__':
    ids_list = …
Run Code Online (Sandbox Code Playgroud)

python postgresql psycopg2 multiprocessing

6
推荐指数
1
解决办法
2112
查看次数

用于在python中重音不敏感替换的正则表达式

在Python 3中,我希望能够以re.sub()"不区分重音"的方式使用,因为我们可以使用re.I不区分大小写的替换标志.

可能是re.IGNOREACCENTS一面旗帜:

original_text = "¿It's 80°C, I'm drinking a café in a cafe with Chloë?"
accent_regex = r'a café'
re.sub(accent_regex, 'X', original_text, flags=re.IGNOREACCENTS)
Run Code Online (Sandbox Code Playgroud)

这将导致"¿它的温度为80°C,我正在用Chloë在X中饮用X."(请注意,"Chloë"仍然有一个重点而不是"¿它是80°C,我正在饮用X"与Chloë的咖啡馆."在真正的蟒蛇.

我认为这样的旗帜不存在.那么这样做的最佳选择是什么?使用re.finditerunidecode两个original_textaccent_regex,然后通过分割字符串替换?或修改accent_regex其重音变体中的所有字符,例如:r'[cç][aàâ]f[éèêë]'

python regex unicode non-ascii-characters accent-insensitive

6
推荐指数
1
解决办法
2133
查看次数

psycopg2 AsIs 和 sql 模块之间的区别

要在查询中动态选择表名,我曾经使用AsIs()psycopg2.extensionshttp://initd.org/psycopg/docs/extensions.html#psycopg2.extensions.AsIs ,语法如下:

cur.execute("SELECT * FROM %s WHERE id = %s;", (AsIs('table_name'), id))
Run Code Online (Sandbox Code Playgroud)

但是,文档现在建议使用psycopg2.sql2.7 版中提供的新模块 ( http://initd.org/psycopg/docs/sql.html#module-psycopg2.sql ),语法如下:

from psycopg2 import sql

cur.execute(
    sql.SQL("SELECT * FROM {} WHERE id = %s;")
        .format(sql.Identifier('table_name')), (id, )
Run Code Online (Sandbox Code Playgroud)

sql除了模块公开的对象可以直接传递给 之外,这两个选项之间还有什么区别execute()

python psycopg2 string-concatenation string-interpolation

5
推荐指数
1
解决办法
9599
查看次数