假设我有一个包含两个字段的数据库表,"foo"和"bar".它们都不是唯一的,但每个都被编入索引.但是,它们每个都有一个单独的索引,而不是被索引在一起.
现在假设我执行一个查询,例如SELECT * FROM sometable WHERE foo='hello' AND bar='world';
My table,foo为'hello'的行数很多,而bar为'world'的行数很少.
因此,数据库服务器最有效的方法是使用bar索引查找bar为'world'的所有字段,然后仅返回foo为'hello'的那些行.这是O(n)
n是bar为'world'的行数.
但是,我想这个过程可能会反过来,使用fo索引并搜索结果.这就是O(m)
m是foo为'hello'的行数.
那么Oracle足够聪明,可以在这里高效搜索吗?其他数据库怎么样?或者有什么方法可以在我的查询中告诉它以正确的顺序搜索?也许bar='world'
在WHERE
条款中排在第一位?
Python文件对象有一个read方法,它接受一个可选的size参数,它基本上是要返回的最大字节数.例如:
fname = "message.txt"
open(fname, "w").write("Hello World!")
print open(fname).read() # prints the entire file contents
print open(fname).read(5) # print "Hello"
print open(fname).read(99) # prints "Hello World!"
Run Code Online (Sandbox Code Playgroud)
因此,即使我们的文件少于99个字符,也会read(99)
立即调用所有可用数据.
我想在socket.makefile返回的文件对象上获得此行为.但如果我说:
import socket
ADDR = ("localhost", 12345)
listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listener.bind(ADDR)
listener.listen(1)
client = socket.create_connection(ADDR)
cf = client.makefile("r+b", bufsize=0)
server, client_addr = listener.accept()
sf = server.makefile("r+b", bufsize=0)
sf.write("Hello World!")
sf.flush()
print cf.read(99) # hangs forever
Run Code Online (Sandbox Code Playgroud)
根据socket.makefile
文档,"可选模式和bufsize参数的解释方式与内置文件()函数的解释方式相同." 但是我的原始文件示例即使在我说的时候open(fname, "r+b", 0)
也可以工作,而我无法找到一种方法,使用套接字伪文件将所有可用数据返回到指定的字节数.
如果我只是使用它,这似乎工作得很好socket.recv
:
import …
Run Code Online (Sandbox Code Playgroud) 是否有单行方法来检查Python 2d dict是否具有内部键/值?
现在我做这样的事情:
if d.has_key(k1):
if d[k1].has_key(k2):
# do something
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
谢谢
我有一个带有serialize
方法的自定义类,我希望能够将此类直接编写到文件中,并serialize
在Python 2.6中编写方法的返回值.(我不是想腌制我的物体,这是完全不同的东西.)例如:
class Foo(object):
def serialize(self):
return "Hello World!"
__str__ = serialize
foo = Foo()
f = open("foo.dat", "wb")
f.write(foo)
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,我得到以下异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument 1 must be convertible to a buffer, not Foo
Run Code Online (Sandbox Code Playgroud)
好的,所以我需要我的Foo
课来实现buffer
界面.我甚至在缓冲区文档中看到它说:"缓冲区接口的示例用户是文件对象的write()方法.任何可以通过缓冲区接口导出一系列字节的对象都可以写入文件."
显然我可以做我想做的事,但是文档实际上并没有说明为了实现缓冲接口我需要实现哪些方法.我已经试过落实__str__
,__unicode__
,__len__
,甚至__sizeof__
.我已经实现了__getitem__
,__setitem__
并且__delitem__
接受了这两个int
和slice
参数.我甚至已经试过落实过时__getslice__
,__setslice__
和__delslice__ …
我有以下课程:成分,食谱和食谱内容......
class Ingredient(models.Model):
name = models.CharField(max_length=30, primary_key=True)
qty_on_stock = models.IntegerField()
def __unicode__(self):
return self.name
class Recipe(models.Model):
name = models.CharField(max_length=30, primary_key=True)
comments = models.TextField(blank=True)
ingredient = models.ManyToManyField(Ingredient)
def __unicode__(self):
return self.name
class RecipeContent(models.Model):
recipe = models.ForeignKey(Recipe)
ingredients = models.ForeignKey(Ingredient)
qty_used = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
但是对于RecipeContent中的__unicode __(),我想使用这个RecipeContent所属的Recipe名称...有没有办法做到这一点?
我正在为Python库编写一些单元测试,并希望将某些警告作为异常引发,我可以使用simplefilter函数轻松完成.但是,对于一个测试,我想禁用警告,运行测试,然后重新启用警告.
我正在使用Python 2.6,所以我应该能够使用catch_warnings上下文管理器,但它似乎对我不起作用.即使失败了,我也应该能够调用resetwarnings然后重新设置我的过滤器.
这是一个简单的例子来说明问题:
>>> import warnings
>>> warnings.simplefilter("error", UserWarning)
>>>
>>> def f():
... warnings.warn("Boo!", UserWarning)
...
>>>
>>> f() # raises UserWarning as an exception
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
UserWarning: Boo!
>>>
>>> f() # still raises the exception
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
UserWarning: Boo!
>>> …
Run Code Online (Sandbox Code Playgroud) 我有一个XML文档,我正在使用它 lxml.etree.tostring
print etree.tostring(doc, pretty_print=True)
Run Code Online (Sandbox Code Playgroud)
默认的缩进级别是2个空格,我想将其更改为4个空格.在函数中没有任何争论tostring
; 有没有办法用lxml轻松完成这项工作?
我正在python和扭曲的框架中创建一个聊天守护进程.我想知道是否必须删除我的函数中创建的每个变量,以便在连接多个用户时长期保存内存,或者这些变量是否自动清除?这是我的代码的精简版,以说明我的观点:
class Chat(LineOnlyReceiver):
LineOnlyReceiver.MAX_LENGTH = 500
def lineReceived(self, data):
self.sendMessage(data)
def sendMessage(self, data):
try:
message = data.split(None,1)[1]
except IndexError:
return
self.factory.sendAll(message)
#QUESTION : do i have to delete message and date??????????????????
del message
del data
class ChatFactory(Factory):
protocol = Chat
def __init__(self):
self.clients = []
def addClient(self, newclient):
self.clients.append(newclient)
def delClient(self, client):
self.clients.remove(client)
def sendAll(self, message):
for client in self.clients:
client.transport.write(message + "\n")
Run Code Online (Sandbox Code Playgroud) 假设我有一个事件处理程序,它对服务器进行两次AJAX调用:
$("#foo").click(function(){
$.get("bar", function(){ alert("Hello"); });
$.get("baz", function(){ alert("World"); });
});
Run Code Online (Sandbox Code Playgroud)
我意识到调用回调的顺序是不确定的,因为它取决于每个请求需要多长时间等.
但这是我的问题:是否保证在调用任何一个回调函数之前我将到达事件处理程序的末尾?我已经读过一个页面的所有Javascript都在一个线程中执行,所以我认为这意味着我click
可以保证在调用任何回调之前完成我的事件处理程序.
它是否正确?或者第一个请求是否可能完成并且在我们甚至到达事件处理程序结束之前执行了第一个回调?