标签: with-statement

生成DOM元素时替代JavaScript`with`语句

比如,我有一个JavaScript库来生成如下所示的DOM片段

<main>
  <h1>A heading</h1>
  <p>A paragraph</p>
</main>
Run Code Online (Sandbox Code Playgroud)

库,domlib包含任何类型元素的方法,以及生成上述片段的函数可能如下所示:

function(domlib){
  return domlib.main(
    domlib.h1('A heading'),
    domlib.p('A paragraph')
  );
}
Run Code Online (Sandbox Code Playgroud)

在这个函数中,我宁愿调用这样的domlib方法:

main(
  h1('A heading'),
  p('A paragraph')
)
Run Code Online (Sandbox Code Playgroud)

为实现这一目标,我可以将所有方法domlib放在全局范围内,但我宁愿避免污染全局范围.对我而言,这似乎with是一个理想的解决方案:

function(domlib){
  with(domlib){
    return main(
      h1('A heading'),
      p('A paragraph')
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

虽然仍然受支持,但with语句实际上已弃用,并将在严格模式下抛出错误.

我没有看到很多其他选项,除了将domlib方法分配给本地函数变量,但这很容易导致数十个局部变量的分配,在这种情况下,第一种方法(domlib直接调用方法)将导致更简单的代码.

我的问题是,是否有其他替代方案可以实现我想要的,具有与使用with语句类似的简单性和可读性?

javascript scope with-statement

7
推荐指数
1
解决办法
1448
查看次数

有和没有“as”子句的上下文管理器的区别

首先,我需要道歉,因为我还不能为我的问题提供明确的MCVE。我的问题是关于我在代码库深处遇到的一个奇怪现象,我想了解这是如何发生的,所以在某种程度上,我首先要问的是如何为这种现象创建MCVE。

tl;博士

aswith根本不使用分配变量的语句中是否使用子句怎么会很重要?

更长的版本

我们正在使用 Airflow(Apache 项目),其中存在一个名为的类DAG。此类应该用作以下with子句的上下文管理器:

with DAG(**some_parameters) as dag:
    do_something_with(dag)
Run Code Online (Sandbox Code Playgroud)

这按预期工作。

但是,在某些情况下,我们不会dagwith子句中使用该变量,因此 IDE 会发出警告,接下来将其重命名为_dag(以声明不使用),我尝试as dag完全删除该子句:

with DAG(**some_parameters):
    do_something_without_passing_dag()
Run Code Online (Sandbox Code Playgroud)

根据我对 Python 的理解,这应该等同as dag于运行时带有子句的版本:

with DAG(**some_parameters) as dag:
    do_something_without_passing_dag()
Run Code Online (Sandbox Code Playgroud)

但是,令人惊讶的是,在 Airflow 项目的背景下,两者之间似乎存在差异。使用该as dag子句,代码按预期工作;如果没有该as dag子句,则会显示错误(请参阅本文末尾)。令人沮丧的是,此错误出现在 Airflow 进程的日志中,并且根本不包含对我的代码的引用。

我需要指出的是,在 Airflow 上下文中,这些with语句位于小模块的顶层,因此该as语句会创建一个模块全局变量(如果存在)。我不知道这是否相关。如果是这样,我不明白为什么。

我的理解,它应该永远不会有任何区别我是否提供了一个as条款或不,如果我完全不使用变量。尽管如此,情况似乎仍然如此。

我已经调查了三个方面:

  1. 我监控__enter__()DAG …

python with-statement contextmanager

7
推荐指数
1
解决办法
509
查看次数

改进Python 2.4的"with"语句的替代品

您能否建议一种方法来编写可在Python 2.4中使用的"with"语句的替代品?

这将是一个黑客,但它将允许我更好地将我的项目移植到Python 2.4.

编辑: 删除不相关的元类草图

python with-statement

6
推荐指数
1
解决办法
1772
查看次数

Javascript沙盒

我想让开发人员在Javascript中为一个网站编写一些自定义应用程序,但是我想要沙箱,这样他们就不能做任何顽皮的事情,比如重定向用户,将主体显示设置为无等等.我在Javascript中有一个命名空间他们需要的功能存在于那里,所以我想创建一个沙箱将是一个问题:

with(Namespace) {
    //App code goes here where they can only access Namespace.*
}
Run Code Online (Sandbox Code Playgroud)

如何轻松解决这个问题以及可以采取哪些其他方法?宁愿不必审核每个提交的应用程序.

javascript sandbox with-statement

6
推荐指数
2
解决办法
4004
查看次数

有关在Delphi中使用嵌套"With"语句的任何资源/教程吗?

我正在尝试正确使用delphi中的语句.

总的来说,做简单的事情似乎相当简单,但我有兴趣找到一些关于使用嵌套语句的好的代码示例和/或教程.例如

with object1, object2, etc... do 
  begin
  statements
  end;
Run Code Online (Sandbox Code Playgroud)

我不确定的是以这种方式使用语句时的优先顺序.

任何建议表示赞赏.

delphi with-statement

6
推荐指数
3
解决办法
1026
查看次数

python中的"with"语句,为什么"as"部分必须是单个对象

使用Python可以说:

a,b,c=something_that_returns_a_3_tuple()
Run Code Online (Sandbox Code Playgroud)

但是with声明如下:

class thing(object):
    def __enter__(self):
        return (1,2,3)

    def __exit__(self,a,b,c):
        pass

with thing() as a,b,c:
    print a
    print b 
    print c
Run Code Online (Sandbox Code Playgroud)

不会工作

必须有:

class thing(object):
    def __enter__(self):
        return (1,2,3)

    def __exit__(self,a,b,c):
        pass

with thing() as (a,b,c):
    print a
    print b 
    print c
Run Code Online (Sandbox Code Playgroud)

我不能看到允许第一个表单的实际问题,通过这个我的意思是实现或逻辑,解析器不应该有逗号的问题(它不会模棱两可),我认为没有逻辑原因为什么不.

http://docs.python.org/release/2.5/whatsnew/pep-343.html

http://www.python.org/dev/peps/pep-0343/表明这只是合成糖

python with-statement contextmanager

6
推荐指数
1
解决办法
291
查看次数

Python语法:with_stmt

完整的python语法规范 with声明中定义为:

with_stmt: 'with' with_item (',' with_item)*  ':' suite
with_item: test ['as' expr]
Run Code Online (Sandbox Code Playgroud)

在哪里expr:

expr: xor_expr ('|' xor_expr)*
xor_expr: and_expr ('^' and_expr)*
and_expr: shift_expr ('&' shift_expr)*
Run Code Online (Sandbox Code Playgroud)

为什么with_item包含expr规则而不是普通name

这是有效的python代码:

with open('/dev/null') as f:
    pass
Run Code Online (Sandbox Code Playgroud)

根据语法,这段代码也有效吗?

with open('/dev/null') as x^y|z:
    pass
Run Code Online (Sandbox Code Playgroud)

python grammar with-statement

6
推荐指数
1
解决办法
166
查看次数

在 lambda 中使用上下文管理器,如何?

如何在 lambda 中使用上下文管理器?接受黑客攻击。暂缓认为这是 lambda 的错误用法的观点。

我知道我可以这样做:

def f():
    with context():
        return "Foo"
Run Code Online (Sandbox Code Playgroud)

但我想做这样的事情:

lambda: with context(): "Foo"
Run Code Online (Sandbox Code Playgroud)

python lambda with-statement contextmanager

6
推荐指数
1
解决办法
1890
查看次数

使用 csv.reader(open(..)..) 时如何修复“AttributeError: __enter__”?

我的代码出现以下错误:

Traceback (most recent call last):
File "C:\Users\XXX\Sentiment Analysis-vader.py", line 34, in <module>
    f.printer()

File "C:\Users\XXX\Sentiment Analysis-vader.py", line 18, in printer
    with csv.reader(open('analyse_' + str(bloombergcode) + '.csv', 'r'), delimiter= ",",quotechar='|') as q2:

AttributeError: __enter__

Process finished with exit code 1
Run Code Online (Sandbox Code Playgroud)

我使用了以下代码:

import csv
from nltk.sentiment.vader import SentimentIntensityAnalyzer

class VaderSentiment:
    def __init__(self, bloomcode):
        self.bloomcode = bloomcode

    def print_sentiment_scores(self, sentence):
        self.sentence = sentence
        analyser = SentimentIntensityAnalyzer()
        snt = analyser.polarity_scores(self.sentence)
        print("{:-<40} {}".format(self.sentence, str(snt)))

    def printer(self):
        bloombergcode = self.bloomcode
        with csv.reader(open('analyse_' + str(bloombergcode) + …
Run Code Online (Sandbox Code Playgroud)

python csv with-statement

6
推荐指数
1
解决办法
8859
查看次数

是否有“with conn.cursor() as...”的方式来使用 Sqlite?

而不是使用:

import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute(...)
c.close()
Run Code Online (Sandbox Code Playgroud)

是否可以使用 Pythonic 成语:

with conn.cursor() as c:
    c.execute(...)
Run Code Online (Sandbox Code Playgroud)

它似乎不起作用:

AttributeError: __exit__
Run Code Online (Sandbox Code Playgroud)

注:关闭,因为游标是很重要的这个

python database sqlite with-statement

6
推荐指数
2
解决办法
2737
查看次数