最近我和一位同事讨论了C++并且遗憾地说,没有办法用类字段的名字取一个字符串并用该名称提取字段; 换句话说,它缺乏反思.他给了我一个莫名其妙的表情,并询问何时有人需要做这样的事情.
除了"嘿,我现在需要立即行动"之外,我的头脑中没有一个好的答案.所以我坐下来想出了一些我用各种语言反射实际完成的事情.不幸的是,我的大多数例子来自我在Python中的Web编程,我希望这里的人会有更多的例子.这是我提出的清单:
给定一个包含
x ="Hello World!" 等行的配置文件
y = 5.0
动态设置某个config对象的字段等于该文件中的值.(这是我希望我能用C++做的,但实际上做不到.)
排序对象列表时,根据配置文件或Web请求中属性名称的任意属性进行排序.
编写使用网络协议的软件时,反射允许您根据该协议的字符串值调用方法.例如,我编写了一个IRC机器人,它将转换
!some_command arg1 arg2
为方法调用actions.some_command(arg1, arg2)并打印返回IRC通道的任何函数.
当使用Python的__getattr__函数(类似于Ruby/Smalltalk中的method_missing)时,我正在使用一个包含大量统计信息的类,例如late_total.对于每个统计数据,我希望能够添加_percent以将该统计数据作为我计算的总数的百分比(例如,stats.late_total_percent).反思使这很容易.
那么这里的任何人都可以从他们自己的编程经验中给出任何反映有用的例子吗?下一次同事问我为什么"想要做那样的事情"我想做好准备.
我打算转向Python,我还有一些额外的问题以及标题:
你的答案真的对我们PHP开发者想要的东西更有用我猜:)
提前致谢!
是否可以在不使用COM对象的情况下读取和编写Python中的Word(2003和2007)文件?
我知道我可以:
f = open('c:\file.doc', "w")
f.write(text)
f.close()
Run Code Online (Sandbox Code Playgroud)
但Word会将其读作HTML文件而不是本机.doc文件.
我正在为Django项目编写一些单元测试,我想知道是否可能(或必要?)来测试我为它编写的一些装饰器.
这是我写的一个装饰器的例子:
class login_required(object):
def __init__(self, f):
self.f = f
def __call__(self, *args):
request = args[0]
if request.user and request.user.is_authenticated():
return self.f(*args)
return redirect('/login')
Run Code Online (Sandbox Code Playgroud) 与Tkinter和wxPython一起玩了一下,我觉得Tkinter在源代码的外观方面要好得多.但是,它似乎没有那么多功能; 特别是它没有标签(如Firefox窗口顶部的标签).
关于这个主题的一点点Google搜索提供了一些建议.有一个类的食谱条目允许你使用标签,但它非常原始.在SourceForge上还有Python megawidgets,虽然这看起来很旧并且在安装过程中给了我错误.
有没有人有经验在Tkinter中制作标签式GUI?你用了什么?或者只是需要更强大的窗口组件的人必须使用wxPython?
假设我有一个初始化的Javascript对象
var letters = {q:0, t:0, o:0, b:0, y:0, n:0, u:0, m:0, p:0,
w:0, a:0, d:0, k:0, v:0, c:0, z:0, l:0, j:0,
i:0, e:0, g:0, s:0, x:0, r:0, h:0, f:0};
Run Code Online (Sandbox Code Playgroud)
然后我想迭代这些对象的键
for(var letter in letters) {
// code goes here
}
Run Code Online (Sandbox Code Playgroud)
在Firefox 3和Internet Explorer 8中,对象按照它们在对象声明(q,t,o,b,y等)中列出的顺序进行迭代.
我可以依靠吗?假设在迭代之前我没有以任何方式修改我的对象.它是ECMAScript标准的一部分吗?有谁知道哪些浏览器在声明的顺序中迭代?
我的同事正在使用我们没有源代码的第三方.NET库.我们正在使用ThreadPool让很多线程调用到这个库中,偶尔其中一个线程将永远挂起,而其余的线程会随意地突然出现.
所以我们想用dreaded Thread.Abort来杀死这样的线程.在我自己创建线程之前我已经完成了这个,但我从未使用过ThreadPool.如果我们跟踪每个任务的开始时间,如下所示:
static Dictionary<Thread, DateTime> started = new Dictionary<Thread, DateTime>();
static void DoSomeWork(object foo)
{
lock(started)
started[Thread.CurrentThread] = DateTime.Now;
SomeBuggyLibraryThatMightInfiniteLoopOrSomething.callSomeFunction(doo);
lock(started)
started.Remove(Thread.CurrentThread);
}
Run Code Online (Sandbox Code Playgroud)
然后我们可以锁定并迭代正在运行的线程并调用Thread.Abort以杀死它们吗?如果我们这样做,那么我们是否需要向ThreadPool添加一个新线程来替换我们刚刚杀死的线程,或者ThreadPool会为我们处理它?
编辑:我非常清楚所有潜在的问题Thread.Abort.我知道理想情况下它应该永远不会在生产代码中使用,并且它不一定会停止线程,并且如果你在线程获得锁定时中止线程,那么你可以挂断其他线程等.但是现在我们是在时间紧,我们有体面的理由相信,在这一特定情况下,我们可以调用Thread.Abort没有把整个过程处于危险之中,我们想避免重写这个程序,以消除线程池,除非我们绝对必须.
所以我想知道的是这样的:因为我们将调用Thread.Abort上属于一个线程池线程,有没有引起这些是线程池线程的任何特殊问题,做我们必须手动旋转了一个新的线程来代替一个被杀的人还是ThreadPool会为我们做的?
例:
a_list = [1, 2, 3]
a_list.len() # doesn't work
len(a_list) # works
Run Code Online (Sandbox Code Playgroud)
Python(非常)面向对象,我不明白为什么'len'函数不会被对象继承.另外,我一直在尝试错误的解决方案,因为它对我来说似乎是合乎逻辑的
所以我正在编写一个Javascript库,它采用x,y坐标并使用它们绘制美国地图.为此,我需要找到绘制每个状态所需的坐标数据.维基百科上的这个地图是我需要的一个很好的例子,因为SVG文件包含组成每个州的形状很好地标记:http://upload.wikimedia.org/wikipedia/commons/3/32/Blank_US_Map.svg
我还有一组我需要放在这张地图上的网站.由于我知道每个站点的纬度和经度,我可以使用它来在地图上的适当位置绘制每个站点.不幸的是,为了实现这一点,我的地图需要使用墨卡托投影,这样就可以轻松映射lat,long到x,y像素坐标.
我上面提到的维基百科地图使用了一些其他投影,所以我不能将它用于此目的.有没有人知道我在Mercator投影中哪里可以找到这种类型的地图数据?任何数据格式都可以,只要我能以编程方式获取用于绘制每个状态的坐标并识别哪些形状构成每个状态.
当我在连接的一端关闭套接字时,另一端在第二次发送数据时会收到错误,但不是第一次:
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("localhost", 12345))
server.listen(1)
client = socket.create_connection(("localhost",12345))
sock, addr = server.accept()
sock.close()
client.sendall("Hello World!") # no error
client.sendall("Goodbye World!") # error happens here
Run Code Online (Sandbox Code Playgroud)
我已经尝试设置TCP_NODELAY,使用send而不是sendall检查fileno(),我找不到任何方法来获取第一个发送错误,甚至检测到它失败后. 编辑:sock.shutdown之前打电话sock.close没有帮助. 编辑#2:即使time.sleep在结束之后和写作之前添加也没关系. 编辑#3:检查返回的字节数send没有帮助,因为它总是返回消息中的字节数.
因此,如果我想检测错误,我能想出的唯一解决方案就是sendall使用一个client.sendall("")会引发错误的解决方案.但这似乎很苛刻.我在Linux 2.6.x上,所以即使解决方案仅适用于该操作系统,我也会感到高兴.
python ×6
.net ×1
c# ×1
decorator ×1
django ×1
gis ×1
javascript ×1
mercator ×1
ms-word ×1
php ×1
proj4js ×1
read-write ×1
reflection ×1
sockets ×1
tabs ×1
threadpool ×1
tkinter ×1
unit-testing ×1
wxpython ×1