- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 ctypes
模块中,底层 c_*
类型执行 C 风格的截断而不引发任何异常。例如,c_uint8(0x120)
与 c_uint8(0x20)
相同,后者与 c_uint8(32)
相同。我希望创建继承 ctypes
类型的类,如果类型超出其范围,这些类将引发自定义异常。这是我到目前为止想出的:
from ctypes import *
class C_U8(c_uint8):
def __init__(self, value):
if value < 0 or value > 0xFF:
raise Exception("Nice try! Out of range")
虽然这按预期工作,但我很快意识到,为每个 ctypes
类型编写这将成为一个相当多余的类。我想知道是否有更好的方法来做到这一点,例如创建一个从 ctypes
模块继承所有类型的泛型类,并相应地对每种类型进行边界检查?
最佳答案
这是一种使用类工厂函数来实现的方法。您向函数传递一个 ctypes
数据类型类和所需的边界,它返回一个新类,该类在创建实例或其 .value
属性更新时强制执行边界。
我只在 Python 2.6.6 上测试过这段代码,但它应该可以在 Python 3 上运行(一旦你修复了 main()
中的 print
语句)。
#!/usr/bin/env python
''' Bounded ctypes integer classes
Derive bounded versions of the ctypes integer datatype classes
For http://stackoverflow.com/q/31317553/4014959
Written by PM 2Ring 2015.07.10
'''
import ctypes
import sys
bounds_info = (
('c_byte', -2**7, 2**7-1),
('c_int', -2**31, 2**31-1),
('c_int16', -2**15, 2**15-1),
('c_int32', -2**31, 2**31-1),
('c_int64', -2**63, 2**63-1),
('c_int8', -2**7, 2**7-1),
('c_long', -2**31, 2**31-1),
('c_longlong', -2**63, 2**63-1),
('c_short', -2**15, 2**15-1),
('c_ubyte', 0, 2**8-1),
('c_uint', 0, 2**32-1),
('c_uint16', 0, 2**16-1),
('c_uint32', 0, 2**32-1),
('c_uint64', 0, 2**64-1),
('c_uint8', 0, 2**8-1),
('c_ulong', 0, 2**32-1),
('c_ulonglong', 0, 2**64-1),
('c_ushort', 0, 2**16-1),
)
def bounded_ctypes_class(name, lo, hi):
''' Derive a bounded version of a named ctypes integer class '''
parent = getattr(ctypes, name)
class Bint(parent):
def __init__(self, value=0):
if lo <= value <= hi:
super(Bint, self).__init__(value)
else:
raise ValueError, (
'Out of bounds: %s initial value %d is not between %d & %d'
% (self, value, lo, hi))
def __setattr__(self, attr, value):
#print "%s setattr('%s', %s) called" % (self, attr, value)
if attr == 'value' and not self._lolim <= value <= self._hilim:
raise ValueError, (
'Out of bounds: %s update value %d is not between %d & %d'
% (self, value, lo, hi))
super(Bint, self).__setattr__(attr, value)
newname = 'b' + name
Bint.__name__ = newname
Bint._lolim = lo
Bint._hilim = hi
return Bint
#Create the bounded classes
def create_classes():
module = sys.modules[__name__]
for name, lo, hi in bounds_info:
cls = bounded_ctypes_class(name, lo, hi)
setattr(module, cls.__name__, cls)
#Test the bounded classes
def main():
module = sys.modules[__name__]
for name, lo, hi in bounds_info:
newname = 'b' + name
cls = getattr(module, newname)
print 'Testing', cls
good = lo + 3 * (hi - lo) // 4
for v in (good, lo-1, hi+1):
try:
print 'Initializing with\n%d' % v
a = cls(v)
print a.value
a.value += 1
print a.value
a.value += hi
print a.value
except Exception as e:
print e
print
print 40 * '- ' + '\n'
#A test with "normal" instance creation syntax.
a = bc_byte(7); print a, a.value
a.value += 100; print a.value
try:
a.value += 30; print a.value
except Exception as e:
print e
create_classes()
if __name__ == '__main__':
main()
这是输出的最后一个屏幕左右:
Testing <class '__main__.bc_ulong'>
Initializing with
3221225471
3221225471
3221225472
Out of bounds: <bc_ulong object at 0xb732d3d4> update value 7516192767 is not between 0 & 4294967295
Initializing with
-1
Out of bounds: <bc_ulong object at 0xb732d38c> initial value -1 is not between 0 & 4294967295
Initializing with
4294967296
Out of bounds: <bc_ulong object at 0xb732d4ac> initial value 4294967296 is not between 0 & 4294967295
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Testing <class '__main__.bc_ulonglong'>
Initializing with
13835058055282163711
13835058055282163711
13835058055282163712
Out of bounds: <bc_ulonglong object at 0xb732d38c> update value 32281802128991715327 is not between 0 & 18446744073709551615
Initializing with
-1
Out of bounds: <bc_ulonglong object at 0xb732d4ac> initial value -1 is not between 0 & 18446744073709551615
Initializing with
18446744073709551616
Out of bounds: <bc_ulonglong object at 0xb732d3d4> initial value 18446744073709551616 is not between 0 & 18446744073709551615
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Testing <class '__main__.bc_ushort'>
Initializing with
49151
49151
49152
Out of bounds: <bc_ushort object at 0xb732d4ac> update value 114687 is not between 0 & 65535
Initializing with
-1
Out of bounds: <bc_ushort object at 0xb732d3d4> initial value -1 is not between 0 & 65535
Initializing with
65536
Out of bounds: <bc_ushort object at 0xb732d38c> initial value 65536 is not between 0 & 65535
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<bc_byte object at 0xb732d3d4> 7
107
Out of bounds: <bc_byte object at 0xb732d3d4> update value 137 is not between -128 & 127
关于python - 创建 'generic' 类继承外部模块类的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31317553/
如何指示 webpack 排除所有 d3 模块? // does not work externals: { "d3-*": "d3" } 所以如果应用导入了d3-submod
这个问题在这里已经有了答案: 9年前关闭。 Possible Duplicate: What does “outer =>” really mean? 我在哪里可以找到有关信息 trait After
这是一个简单的循环,我正在尝试对性能进行基准测试。 var extremeLoop=function(n){ var time=new Date() var t=0; for(
问题+概述 下面是两个片段,其中包含最初隐藏的 div,然后通过单击 button 和 jQuery 的 .show() 显示。两个 div 都具有由外部样式表应用的 display: grid; 样
我有一个 HTML 页面和一个单独的 .js 文件,该文件包含在带有 的页面中标签。 这是我的 .js 文件: element = document.getElementById("test");
我在 linux 静态库项目中有 3 个文件,我想在两个类方法实现文件中使用的静态字段存在链接问题。我有 class1.h、class1main.cpp 和 class1utils.cpp。 clas
我正在尝试将颜色背景更改为默认背景颜色,当我点击输入框外 我尝试使用“null”或“none”但没有用? window.addEventListener('click', outsideClick);
我正在编写一个应用程序,要求用户在手机上选择各种类型的文件。我使用此代码启动文件选择器 Intent : Intent intent = new Intent(Intent.ACTION_GET_C
在 android 中,不可移动(内部)的外部存储和内部存储有什么区别?我不确定在哪里保存我的数据。我只需要保存一个人可以随时提取的游戏统计数据 谢谢 最佳答案 在许多较新的设备中,将不再有物理区别,
在 C++ 中,假设我们有这个头文件: myglobals.h #ifndef my_globals_h #define my_globals_h int monthsInYear = 12; #en
我正在尝试使用 externs 在 C++ 中连接到 Ada。这两种实现有什么区别? 实现A namespace Ada { extern "C" { int getN
这个问题在这里已经有了答案: Get selected element's outer HTML (30 个答案) 关闭 2 年前。 想象一下我们有这样的东西: Hello World 如果我们这样
假设我在模块的顶部有这个: Public Declare Function getCustomerDetails Lib "CustomerFunctions" () As Long 如果我从 VB6
我目前正在使用这段代码: var wordRandomizer = { run: function (targetElem) { var markup = this.creat
我们正在使用 SVN 试水,并以 Beanstalk 作为主机。我们的设置如下所示: 存储库:模块 模块一 模块二 模块 3 存储库:网站1 自定义网站代码 svn:对模块 1 的外部引用 svn:对
有没有办法在负载均衡器中设置自动外部 IP 分配给像谷歌这样的服务? 我在裸机上运行 Kubernetes。 谢谢 最佳答案 使用 nodePort 类型的服务,它会将您的服务绑定(bind)到所有节
是否有可能在 Controller 之外使用 generateUrl() 方法? 我尝试在带有 $this->get('router') 的自定义存储库类中使用它,但它没有用。 更新 我在这里找到了一
我目前正在尝试通过 Webpack 外部对象外部化 Angular 依赖项来缩短构建时间。到目前为止,我已经为 React 和其他小库实现了这一目标。 如果我只是移动 '@angular/compil
我想创建一个自动应用其他插件的插件(外部插件)。这要求在我称为“应用插件”之前为插件设置构建脚本依赖项。但是似乎我无法在插件中添加buildscript依赖项,或者得到了: 您不能更改处于未解析状态的
我是R包的创建者EnvStats . 有一个我经常使用的函数,叫做 stripChart .我刚开始学习ggplot2 ,并在过去几天里仔细研究了 Hadley 的书、Winston 的书、Stack
我是一名优秀的程序员,十分优秀!