有没有办法引用使用"with"语句创建的对象实例?
例:
with TAnObject.Create do
begin
DoSomething(instance);
end;
Run Code Online (Sandbox Code Playgroud)
DoSomething将使用实例引用,就像您将实例从变量声明引用传递给创建的对象一样.
例:
AnObject := TAnObject.Create;
Run Code Online (Sandbox Code Playgroud)
谢谢.
F#有一个方便的功能"with",例如:
type Product = { Name:string; Price:int };;
let p = { Name="Test"; Price=42; };;
let p2 = { p with Name="Test2" };;
Run Code Online (Sandbox Code Playgroud)
F#创建关键字"with"作为记录类型默认是不可变的.
现在,是否可以在C#中定义类似的扩展?看起来有点棘手,就像在C#中我不确定如何转换字符串
Name="Test2"
Run Code Online (Sandbox Code Playgroud)
代表或表达?
我如何使用Contextmanager实例变量?我们假设我有一些Connection课程,必须在破坏时关闭.如果我将它作为ContextManager实现,我可以做到.
with Connection() as c:
c.write('FOO')
c.ask('BAR?')
Run Code Online (Sandbox Code Playgroud)
它会在销毁时自动关闭.但是如果我想在__init__另一个类中使用它,例如下面的例子呢?
class Device(object):
def __init__(self):
self.connection = Connection() # Must be closed on destruction.
Run Code Online (Sandbox Code Playgroud)
我不希望它在构造函数的退出时关闭,它应该在对象被破坏时死亡.我可以使用,__del__但这有它的缺点.习惯于在C++中使用RAII它让我感到困惑.
那么在这种情况下,最好的方法是什么?
我总是使用with语句打开并写入文件:
with open('file_path', 'w') as handle:
print >>handle, my_stuff
Run Code Online (Sandbox Code Playgroud)
但是,有一个实例,我需要能够更灵活,并写入sys.stdout(或其他类型的流),如果提供而不是文件路径:
所以,我的问题是:有没有办法使用with真实文件和使用语句sys.stdout?
请注意,我可以使用以下代码,但我认为这违背了使用目的with:
if file_path != None:
outputHandle = open(file_path, 'w')
else:
outputHandle = sys.stdout
with outputHandle as handle:
print >>handle, my_stuff
Run Code Online (Sandbox Code Playgroud) 我查看了建议的问题以找到问题的答案.最近的问题称为:计算不同Excel工作表中不同Excel工作表 计数行数的行数
该问题的解决方案对我不起作用.
我试图计算不同工作表中的范围内的行数而不是活动工作表.这是我的代码:
Sub verbflashcards()
Dim wordcount As Long
With Worksheets("Verbs")
wordcount = .Range(Cells(4, 1), Cells(4, 1).End(xlDown)).Rows.Count
End With
MsgBox (wordcount)
End Sub
Run Code Online (Sandbox Code Playgroud)
我有一个名为Verbs的工作表,它是工作簿中的第二个工作表.我试过了:
With Verbs
With Sheet2
With Sheets("Verbs")
With Sheets("Sheet2")
Run Code Online (Sandbox Code Playgroud)
他们似乎都没有工作.
我正在尝试理解使用context-manager(带语句)对代码进行单元测试的正确方法.
这是我的示例代码:
class resources():
def __init__(self):
self.data = 'at-init'
def __enter__(self):
self.data = 'at-enter'
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.data = 'at-exit'
Run Code Online (Sandbox Code Playgroud)
这是我的unittest代码:
import unittest
import ctxmgr
class TestResources(unittest.TestCase):
def setUp(self):
pass
def test_ctxmgr(self):
with ctxmgr.resources as r:
self.assertEqual(r.data, 'at-enter')
Run Code Online (Sandbox Code Playgroud)
示例代码运行正常,但上面的unittest代码失败,
======================================================================
ERROR: test_ctxmgr (__main__.TestResources)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_ctxmgr.py", line 12, in test_ctxmgr
with ctxmgr.resources as r:
AttributeError: __exit__
----------------------------------------------------------------------
Ran 1 test in 0.003s
FAILED (errors=1)
Run Code Online (Sandbox Code Playgroud)
导致此错误的原因是什么?我错过了什么?
我想确保该类仅在"with"语句中实例化.
即这个是好的:
with X() as x:
...
Run Code Online (Sandbox Code Playgroud)
这不是:
x = X()
Run Code Online (Sandbox Code Playgroud)
我该如何确保这样的功能?
我对Python with声明的理解如下:
withstatement = with+ expression + as+ target + :+ suit
__enter__返回一个目标值__exit__调用上下文管理器的方法我知道可以在step2和step3中处理异常,我的问题是如果在执行表达式的step1期间抛出异常,我可以获得上下文管理器吗?
如果不是,这是否意味着该with声明只是确保诉讼被正确执行和关闭?
就像with open("file") as f,如果文件不存在会发生什么?
我正在努力制作一段代码,允许测量在“with”语句中花费的时间,并将测量的时间(浮点数)分配给“with”语句中提供的变量。
import time
class catchtime:
def __enter__(self):
self.t = time.clock()
return 1
def __exit__(self, type, value, traceback):
return time.clock() - self.t
with catchtime() as t:
pass
Run Code Online (Sandbox Code Playgroud)
这段代码留下t=1而不是 clock() 调用之间的区别。如何解决这个问题?我需要一种从 exit 方法中分配新值的方法。
PEP 343更详细地描述了联系管理器的工作原理,但我不了解其中的大部分内容。
cx_Oracle包含__enter__和__exit__Connection对象上,而不是在游标对象.因此,我到处使用它来包装游标:
class CursorWrapper(object):
def __init__(self, connection):
self.connection = connection
self.cursor = None
def __enter__(self):
self.cursor = self.connection.cursor()
return self.cursor
def __exit__(self, exc_type, exc_value, traceback):
self.cursor.close()
Run Code Online (Sandbox Code Playgroud)
然后,当我想要一个光标
with CursorWrapper(cnx) as cursor:
cursor.execute("whatever sql statement")
Run Code Online (Sandbox Code Playgroud)
它非常适合我的需求.
但是,我当时想知道什么可以阻止__enter__和__exit__方法直接添加到cx_Oracle中?
或者是否有更好的方法将游标与上下文管理一起使用,这可以解释为什么它没有在模块中定义?
编辑:对不起,我刚刚找到答案.我可以使用contextlib.closing.
import contextlib
with contextlib.closing(cnx.cursor()) as cursor:
Run Code Online (Sandbox Code Playgroud) with-statement ×10
python ×7
c# ×1
cx-oracle ×1
delphi ×1
destructor ×1
excel ×1
excel-vba ×1
f# ×1
immutability ×1
stdout ×1
stream ×1
vba ×1