小编mko*_*tee的帖子

解码 ctypes 结构

我正在尝试了解 python 中的 ctypes,并且能够完成一些简单的工作,但是当涉及到解压 c 结构时,我发现自己遇到了一些困难。我决定要学习这个,我应该尝试一下,虽然我知道套接字标准库实现了gethostbyname_ex(),但我想我应该尝试使用ctypes和 来实现它libc.gethostbyname()

我能够libc.gethostbyname()相当轻松地执行:

#!/usr/bin/env python
from ctypes import *

cdll.LoadLibrary('libc.so.6')
libc = CDLL('libc.so.6')
he = libc.gethostbyname("www.google.com")
Run Code Online (Sandbox Code Playgroud)

但这给了我一个hostent数据结构。我认为解压这个的最好方法是获取 c 结构并创建一个继承自 的类ctypes.Structure,所以我想出了这个(我hostent在 中找到了结构定义netdb.h):

class hostent(Structure):
    '''
    struct hostent
    {
      char *h_name;                 /* Official name of host.  */
      char **h_aliases;             /* Alias list.  */
      int h_addrtype;               /* Host address type.  */
      int h_length;                 /* Length of address.  */
      char **h_addr_list;           /* List …
Run Code Online (Sandbox Code Playgroud)

python ctypes structure

3
推荐指数
1
解决办法
2023
查看次数

SQLAlchemy,急切加载postgresql INET/CIDR关系

我在postgresql中有两个表,一个名为ip_address,另一个名为network.

ip_address表有两列:

  1. id 是一个 INTEGER
  2. v4address 是一个 INET

network表有两列:

  1. id 是一个 INTEGER
  2. v4representation 是一个 CIDR

我希望能够选择ip_address并急切加载ip_addresses network(s),而无需id在表之间定义基于外键的关系.这些id列由与其他表无关的其他关系使用.

完成此任务的SQL是:

select * from ip_address join network on ip_address.v4address << network.v4representation;
Run Code Online (Sandbox Code Playgroud)

在postgresql中,<<运算符可用于比较a INET和a CIDR.它将匹配INET包含在其中的行CIDR.

我可以property在我的IPAddress模型上定义一个可以完成此任务的模型:

@property
def networks(self):
    query = session.query(Network)
    query = query.filter("v4representation >> :v4addr").params(v4addr=self.v4address)
    return query.all()
Run Code Online (Sandbox Code Playgroud)

这有效,但是当我真正尝试property在应用程序中使用它时,我遇到了典型的"N + 1"查询问题.我想以这样的方式定义它,以便能够急于加载IP地址网络.

我试图将其定义为relationship …

python postgresql sqlalchemy

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

标签 统计

python ×2

ctypes ×1

postgresql ×1

sqlalchemy ×1

structure ×1