我用谷歌搜索calling __enter__ manually但没有运气.因此,让我们假设我有MySQL连接器类,它使用__enter__和__exit__函数(最初与with语句一起使用)来连接/断开数据库.
让我们有一个使用其中2个连接的类(例如用于数据同步).注意:这不是我现实生活中的情景,但它似乎是最简单的例子.
使这一切协同工作的最简单方法是这样的类:
class DataSync(object):
def __init__(self):
self.master_connection = MySQLConnection(param_set_1)
self.slave_connection = MySQLConnection(param_set_2)
def __enter__(self):
self.master_connection.__enter__()
self.slave_connection.__enter__()
return self
def __exit__(self, exc_type, exc, traceback):
self.master_connection.__exit__(exc_type, exc, traceback)
self.slave_connection.__exit__(exc_type, exc, traceback)
# Some real operation functions
# Simple usage example
with DataSync() as sync:
records = sync.master_connection.fetch_records()
sync.slave_connection.push_records(records)
Run Code Online (Sandbox Code Playgroud)
问:这样调用__enter__/ __exit__手动是否可以(有什么不对)吗?
Pylint 1.1.0没有对此发出任何警告,也没有找到任何关于它的文章(在开始的谷歌链接).
那叫什么呢:
try:
# Db query
except MySQL.ServerDisconnectedException:
self.master_connection.__exit__(None, None, None)
self.master_connection.__enter__() …Run Code Online (Sandbox Code Playgroud) 我有很多自定义的javascript和布局设计,我想阻止人们使用它们.有没有任何实用的方法来做到这一点,或者我基本上只是要高兴我的PHP代码不显示?我想至少让复制我的网站变得困难.
我用我的python脚本创建大文件(1GB实际上有8个).在我创建它们之后,我必须创建将使用这些文件的进程.
该脚本如下所示:
# This is more complex function, but it basically does this:
def use_file():
subprocess.call(['C:\\use_file', 'C:\\foo.txt']);
f = open( 'C:\\foo.txt', 'wb')
for i in 10000:
f.write( one_MB_chunk)
f.flush()
os.fsync( f.fileno())
f.close()
time.sleep(5) # With this line added it just works fine
t = threading.Thread( target=use_file)
t.start()
Run Code Online (Sandbox Code Playgroud)
但应用程序use_file行为foo.txt是空的.有一些奇怪的事情发生了:
C:\use_file C:\foo.txt在控制台中执行(脚本完成后),我得到正确的结果use_file()在另一个python控制台中手动执行,我得到正确的结果C:\foo.txt在open()被调用后立即在磁盘上可见,但0B在脚本结束之前一直保持大小time.sleep(5)它只是按预期开始工作(或者更确切地说是必需的)我已经发现:
os.fsync()但它似乎没有工作(从结果use_file作为是否C:\foo.txt是空的)buffering=(1<<20)(打开文件时)似乎也不起作用 …我正在使用这两个课程
// This is generic data structure containing some binary data
class A {
public:
A();
A(const A&);
~A();
}
// Main data container
class B {
public:
B();
B( const B&);
~B();
protected:
std::vector<A *> data;
}
// Copy constructor for class b
B::B( const B& orig):data() {
for( std::vector<A *>::const_iterator it = orig.data.begin();
it < orig.data.end(); ++it){
data.push_back( new A( *(*it)));
}
}
Run Code Online (Sandbox Code Playgroud)
我想这堂课会做到这一点,但我找到了如何达到完美的目标.
首先:data() - 这是初始化空向量所需的初始化(这是编写一个好的和干净的代码的一部分)?
如何vector::iterator在复制构造函数中使用,我找到的唯一方法就是我写入代码的方法(对于复制构造函数,const应该是必需的).
仅复制矢量会复制指针值而不是整个对象?
最后新的数据初始化...有什么办法可以用较小的代码替换整个循环和/或是否有任何标准如何为包含对象指针的std :: containers编写复制构造函数?
子问题:我假设使用vector<A …
如何创建特定类型对象但为空的列表?是否可以?我想创建一个对象数组(该类型称为 Ghosts),稍后将包含从名为 Ghosts 的类继承的不同类型。在 C++ 中这一切都非常简单,但我不确定如何在 python 中做到这一点。我试过这样的事情:
self.arrayOfGhosts = [[Ghost() for x in xrange(100)] for x in xrange(100)]
Run Code Online (Sandbox Code Playgroud)
但它已经由对象初始化,而我不需要它,有没有办法将它初始化为 0 但有一个 Ghost 类型的列表?
如您所见,我对 python 很陌生。任何帮助将不胜感激。
让我们有一个具有不时失败的功能的类,但是在一些动作之后它才能完美地运行.
现实生活中的例子是Mysql Query提升,_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')但在客户端重新连接后它可以正常工作.
我试过写这个装饰器:
def _auto_reconnect_wrapper(func):
''' Tries to reconnects dead connection
'''
def inner(self, *args, _retry=True, **kwargs):
try:
return func(self, *args, **kwargs)
except Mysql.My.OperationalError as e:
# No retry? Rethrow
if not _retry:
raise
# Handle server connection errors only
# http://dev.mysql.com/doc/refman/5.0/en/error-messages-client.html
if (e.code < 2000) or (e.code > 2055):
raise
# Reconnect
self.connection.reconnect()
# Retry
return inner(self, *args, _retry=False, **kwargs)
return inner
class A(object):
...
@_auto_reconnect_wrapper
def get_data(self):
sql = …Run Code Online (Sandbox Code Playgroud) 我需要一些帮助SELECT FOR UPDATE(相应的LOCK IN SHARE MODE).
我有一个大约有40万条记录的表,我需要在每一行上运行两个不同的处理函数.
表结构恰如其分:
data (
`id`,
`mtime`, -- When was data1 set last
`data1`,
`data2` DEFAULT NULL,
`priority1`,
`priority2`,
PRIMARY KEY `id`,
INDEX (`mtime`),
FOREIGN KEY ON `data2`
)
Run Code Online (Sandbox Code Playgroud)
功能有点不同:
priority1; 集data1和mtimepriority2; 集data1和mtime它们不应该同时修改同一行,但是select可能会在它们中返回一行(priority1并且priority2具有不同的值)并且如果是这样的话,事务可以等待(并且我希望这会是它阻止的唯一情况.
我正在根据以下查询选择数据:
-- For the first function - not processed first, then the oldest,
-- the same age …Run Code Online (Sandbox Code Playgroud) 我有应用程序启动子进程并stdout异步处理它.问题是异步操作需要一些时间,我希望负责进程执行的方法在所有异步IO操作完成后结束.
我有这样的代码:
using System.Diagnostics;
Process process = new Process();
// ...
process.OutputDataReceived += new DataReceivedEventHandler(this.OnRecvStdOut);
process.ErrorDataReceived += new DataReceivedEventHandler(this.OnRecvStdErr);
// ...
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
// ...
process.WaitForExit();
Run Code Online (Sandbox Code Playgroud)
现在我正在寻找一种方法告诉程序等待所有IO(OnRecvStdOut)操作完成.
我虽然使用了System.Threading类中的一个,但我不确定哪个类最适合这个以及如何执行此操作,最好的方法可能是:
public void OnRecvStdOut(...)
{
something.Increase();
// the stuff that takes so long
something.DecreaseAndSignal();
}
Run Code Online (Sandbox Code Playgroud)
并在主要功能:
something.WaitUntilZero();
Run Code Online (Sandbox Code Playgroud)
注:我想同时允许StdErr和StdOut并行处理. Something不能依赖那个Wait会被调用的Signal,因为Increase()和DecreaseAndSignal()对会在Wait发生之前被多次调用.
我想到的第二件事就是可以多次发出信号(无需处理信号)并在主函数中使用循环,如:
while( ioOperations > 0){
something.WaitForSignal(500);
}
Run Code Online (Sandbox Code Playgroud)
我正在为大型项目构建.lib(静态库),我想向库的最终用户隐藏一些函数,但是我需要可以从.c库中的每个文件中调用这些函数(因此不是静态的)。
这恰好相反__declspec(dllexport),我已经找到了gcc的解决方案。
我想使用static,但是静态函数应该仅在“当前.c文件” 内部可用,因此不是这样。
换句话说:我需要一种方法来告诉Microsoft Visual C ++ 2010不要将某些函数导出到final .lib(同时使它们可用于.c项目中的所有其他文件)。
注意:我从未在整个解决方案中使用过__declspec(都不使用__attribute__( visibility)),这可能只是与构建静态库相关的一些默认设置(我无法跟踪)。
我正在寻找一种方法如何subprocess使用低系统优先级的Pythons 模块启动进程,我已经发现:
Unix使用preexec_fn和的解决方案os.nice()resources模块 ,似乎只是为了工作Unixpriority在subprocess手册中没有提到.
我已经有了似乎有效的解决方案:
self.start_low_priority = ('cmd', '/c', 'start', '/MIN', '/LOW', '/B', '/WAIT')
Run Code Online (Sandbox Code Playgroud)
注意: 开关/B /WAIT必须按此顺序才能使用
并将其用作:
args = self.start_low_priority + ( 'foo.exe', 'bar', 'foobar')
subprocess.call( args, shell=False)
Run Code Online (Sandbox Code Playgroud)
但是这个解决方案似乎并不是正确而干净的方式,而且Process Explorer无法从这样的应用程序构建正确的"进程树"(因此您无法终止进程树).
有没有什么好的练习方式来为Windows做这个?Python没有提供任何我错过的多平台解决方案吗?
python ×5
python-3.x ×4
io ×2
windows ×2
c# ×1
c++ ×1
containers ×1
css ×1
decorator ×1
dllexport ×1
export ×1
html ×1
innodb ×1
javascript ×1
large-files ×1
linker ×1
mysql ×1
object ×1
subprocess ×1
transactions ×1
vector ×1
yield ×1