标签: with-statement

我可以使用python with statement进行条件执行吗?

我正在尝试编写支持以下语义的代码:

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-statement

12
推荐指数
1
解决办法
3570
查看次数

使用Python'with'语句时捕获异常 - 第2部分

这是一个问题的延续使用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)

谢谢!

python exception-handling exception with-statement

12
推荐指数
1
解决办法
3100
查看次数

Oracle - WITH CLAUSE => MERGE?(语法错误,)

我正在尝试使用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)

编辑

我实际上发现了如何处理这个问题(在我提交问题之前),但我认为,因为我花了很长时间才找到答案,希望将这个问题留下来意味着下一个人会发现它不是那么很多时间.

我将在一天左右的时间内发布答案,但如果其他人在同一时间发布,他们将获得积分.

oracle merge with-statement subquery-factoring ora-00928

12
推荐指数
1
解决办法
3万
查看次数

查找with:Block中定义的函数

以下是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)

python scope with-statement contextmanager

11
推荐指数
1
解决办法
1098
查看次数

如何用"with"调用tempfile.mkstemp()? - 或者为什么不用__exit __()返回fd?

对我来说,最惯用的方式tempfile.mkstemp()是:

with tempfile.mkstemp() as fd, filename:
    pass
Run Code Online (Sandbox Code Playgroud)

然而,这显然(?)提高了 AttributeError: __exit__

os.close(fd)使用try-finally明确调用是解决这个问题的一种简单方法,但感觉就像违反一样 - 应该有一个 - 最好只有一个 - 明显的方法来做到这一点.

有没有办法"修复"这个tempfile或者有没有理由说明为什么这样实现?

python with-statement temporary-files python-internals

11
推荐指数
2
解决办法
4592
查看次数

如何将Kotlin的`with`表达式用于可空类型

下面的代码将无法编译,因为该变量myType可以为null.有没有办法with在Kotlin中为可空类型执行块?

    val myType: MyType? = null
    with(myType) {
        aMethodThatBelongsToMyType()
        anotherMemberMethod()            
    }
Run Code Online (Sandbox Code Playgroud)

nullable with-statement kotlin

11
推荐指数
2
解决办法
1184
查看次数

变量范围在"with"语句中?

我只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)

python scope with-statement

11
推荐指数
2
解决办法
6572
查看次数

如何避免意外地隐式引用全局对象上的属性?

是否可以在没有with(global)所有脚本默认具有的隐式上下文的情况下执行代码块?例如,在浏览器中,是否可以通过任何方式设置脚本,使诸如

const foo = location;
Run Code Online (Sandbox Code Playgroud)

抛出

未捕获ReferenceError:未定义位置

而不是访问window.location,何时location未先声明?缺少这一点,有没有办法使这种隐式引用导致某种警告?在编写代码时,它可能是错误的来源(见下文),因此有一种防范它的方法可能会很有用。

(当然,由于普通的作用域规则,可以使用constlet或在内部块中声明另一个具有相同名称的变量,以确保使用该变量名称引用的是新变量而不是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。例如:

(这里的问题:window.status是保留属性-分配给它时,它会将分配的表达式强制转换为字符串)

with阻止或禁止显式使用此类错误的原因相同,但with(global)即使在严格模式下,隐式错误也继续引起问题,因此找出解决方法将非常有用。

javascript scope with-statement

11
推荐指数
1
解决办法
511
查看次数

为什么with()构造不包含在C#中,当它在VB.NET中真的很酷时?

我是C#开发人员.我非常喜欢花括号,因为我来自C,C++和Java背景.但是,我也喜欢.NET系列的其他编程语言,比如VB.NET.如果你在.NET中编程了一段时间,那么在C#和VB.NET之间来回切换并不是什么大不了的事.这是我工作的公司非常常见的方法.作为C#的人,我非常喜欢withVB.NET编译器提供的XML文字和关键字.我希望微软也将这些功能包含在C#中.

我只是很好奇,其他开发者对它有什么看法!

c# vb.net with-statement

10
推荐指数
2
解决办法
2048
查看次数

使用--python打开多个文件

通常,我们会使用它来读/写文件:

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讨论这个?

python file-io with-statement

10
推荐指数
1
解决办法
705
查看次数