我正在尝试编写支持以下语义的代码:
with scope('action_name') as s:
do_something()
...
do_some_other_stuff()
Run Code Online (Sandbox Code Playgroud)
范围以及(设置,清理)应该决定是否应该运行此部分.
例如,如果用户将程序配置为绕过'action_name',则在评估Scope()之后,将执行do_some_other_stuff()而不首先调用do_something().
我尝试使用此上下文管理器执行此操作:
@contextmanager
def scope(action):
if action != 'bypass':
yield
Run Code Online (Sandbox Code Playgroud)
但有RuntimeError: generator didn't yield例外(时action为'bypass').
我正在寻找一种方法来支持这一点,而不会回到更详细的可选实现:
with scope('action_name') as s:
if s.should_run():
do_something()
...
do_some_other_stuff()
Run Code Online (Sandbox Code Playgroud)
有谁知道我怎么能做到这一点?
谢谢!
PS我正在使用python2.7
编辑:
解决方案不一定要依赖with语句.没有它,我只是不知道如何表达它.从本质上讲,我想要一种上下文形式的东西(支持设置和自动清理,与所包含的逻辑无关),并允许基于传递给设置方法并在配置中选择的参数进行条件执行.
我还考虑过使用装饰器的可能解决方案.例:
@scope('action_name') # if 'action_name' in allowed actions, do:
# setup()
# do_action_name()
# cleanup()
# otherwise return
def do_action_name()
do_something()
Run Code Online (Sandbox Code Playgroud)
但我不想基于这些范围强制执行太多的内部结构(即,代码如何划分为函数).
有人有一些创意吗?
这是一个问题的延续使用Python'with'语句捕获异常.
我是新手,我在GNU/linux上使用Python 3.2测试了以下代码.
在上述问题中,提出了类似于此的内容,以便从"with"语句中捕获异常:
try:
with open('foo.txt', 'a'):
#
# some_code
#
except IOError:
print('error')
Run Code Online (Sandbox Code Playgroud)
这让我想知道:如果some_code引发IOError而没有捕获它会发生什么?它显然被外部的"除外"声明所吸引,但这可能不是我真正想要的.
你可以说好,只需用另一个try-except包装some_code,依此类推,但我知道异常可以来自任何地方,并且不可能保护每一段代码.
总而言之,我只是想打印'错误',当且仅当open('foo.txt','a')引发异常时,所以我在这里问为什么以下代码不是标准的建议方式这样做:
try:
f = open('foo.txt', 'a')
except IOError:
print('error')
with f:
#
# some_code
#
#EDIT: 'else' statement is missing, see Pythoni's answer
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在尝试使用WITH子句在Oracle中使用合并,但由于某种原因我无法使其工作.我确信这是显而易见的,但我还没有看到它.
-- behold, the wonders of fake data
WITH X AS (
SELECT
'moo' AS COW,
'woof' AS CAT,
(SELECT MAX( DECIBELS ) FROM ANIMALIA WHERE COW = 'moo' ) AS DECIBELS
FROM DUAL )
MERGE INTO ANIMALIA D
USING X
WHEN MATCHED THEN
UPDATE SET D.COW = X.COW;
Run Code Online (Sandbox Code Playgroud)
我实际上发现了如何处理这个问题(在我提交问题之前),但我认为,因为我花了很长时间才找到答案,希望将这个问题留下来意味着下一个人会发现它不是那么很多时间.
我将在一天左右的时间内发布答案,但如果其他人在同一时间发布,他们将获得积分.
以下是Richard Jones博客的一些代码:
with gui.vertical:
text = gui.label('hello!')
items = gui.selection(['one', 'two', 'three'])
with gui.button('click me!'):
def on_click():
text.value = items.value
text.foreground = red
Run Code Online (Sandbox Code Playgroud)
我的问题是:他是怎么做到的?上下文管理器如何访问with块内的范围?这是一个试图解决这个问题的基本模板:
from __future__ import with_statement
class button(object):
def __enter__(self):
#do some setup
pass
def __exit__(self, exc_type, exc_value, traceback):
#XXX: how can we find the testing() function?
pass
with button():
def testing():
pass
Run Code Online (Sandbox Code Playgroud) 对我来说,最惯用的方式tempfile.mkstemp()是:
with tempfile.mkstemp() as fd, filename:
pass
Run Code Online (Sandbox Code Playgroud)
然而,这显然(?)提高了 AttributeError: __exit__
os.close(fd)使用try-finally明确调用是解决这个问题的一种简单方法,但感觉就像违反一样 - 应该有一个 - 最好只有一个 - 明显的方法来做到这一点.
有没有办法"修复"这个tempfile或者有没有理由说明为什么这样实现?
下面的代码将无法编译,因为该变量myType可以为null.有没有办法with在Kotlin中为可空类型执行块?
val myType: MyType? = null
with(myType) {
aMethodThatBelongsToMyType()
anotherMemberMethod()
}
Run Code Online (Sandbox Code Playgroud) 我只firstline使用python 阅读:
with open(file_path, 'r') as f:
my_count = f.readline()
print(my_count)
Run Code Online (Sandbox Code Playgroud)
我对变量my_count的范围感到困惑.虽然打印工作正常,但是my_count = 0首先使用语句做外部更好(例如在C中用于执行int my_count = 0)
是否可以在没有with(global)所有脚本默认具有的隐式上下文的情况下执行代码块?例如,在浏览器中,是否可以通过任何方式设置脚本,使诸如
const foo = location;
Run Code Online (Sandbox Code Playgroud)
抛出
未捕获ReferenceError:未定义位置
而不是访问window.location,何时location未先声明?缺少这一点,有没有办法使这种隐式引用导致某种警告?在编写代码时,它可能是错误的来源(见下文),因此有一种防范它的方法可能会很有用。
(当然,由于普通的作用域规则,可以使用const或let或在内部块中声明另一个具有相同名称的变量,以确保使用该变量名称引用的是新变量而不是global属性,但这不是一样。)
这可能类似于询问是否可以从实际 with语句中停止引用属性:
const obj = { prop: 'prop' };
with (obj) {
// how to make referencing "prop" from somewhere within this block throw a ReferenceError
}
Run Code Online (Sandbox Code Playgroud)
众所周知,with不应该首先使用它,但是不幸的是,当谈到时,我们似乎别无选择with(global),因为它偶尔会节省一些字符,但会浪费一些经常弹出的错误:1 2 3 4 5 6。例如:
const foo = location;
Run Code Online (Sandbox Code Playgroud)
(这里的问题:window.status是保留属性-分配给它时,它会将分配的表达式强制转换为字符串)
with阻止或禁止显式使用此类错误的原因相同,但with(global)即使在严格模式下,隐式错误也继续引起问题,因此找出解决方法将非常有用。
我是C#开发人员.我非常喜欢花括号,因为我来自C,C++和Java背景.但是,我也喜欢.NET系列的其他编程语言,比如VB.NET.如果你在.NET中编程了一段时间,那么在C#和VB.NET之间来回切换并不是什么大不了的事.这是我工作的公司非常常见的方法.作为C#的人,我非常喜欢withVB.NET编译器提供的XML文字和关键字.我希望微软也将这些功能包含在C#中.
我只是很好奇,其他开发者对它有什么看法!
通常,我们会使用它来读/写文件:
with open(infile,'r') as fin:
pass
with open(outfile,'w') as fout:
pass
Run Code Online (Sandbox Code Playgroud)
要读取一个文件并输出到另一个文件,我可以只用一个with吗?
我一直在这样做:
with open(outfile,'w') as fout:
with open(infile,'r') as fin:
fout.write(fin.read())
Run Code Online (Sandbox Code Playgroud)
是否有以下内容,(以下代码不起作用):
with open(infile,'r'), open(outfile,'w') as fin, fout:
fout.write(fin.read())
Run Code Online (Sandbox Code Playgroud)
使用一个with而不是多个有什么好处with?是否有一些PEP讨论这个?