比如,我有一个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语句类似的简单性和可读性?
首先,我需要道歉,因为我还不能为我的问题提供明确的MCVE。我的问题是关于我在代码库深处遇到的一个奇怪现象,我想了解这是如何发生的,所以在某种程度上,我首先要问的是如何为这种现象创建MCVE。
as在with根本不使用分配变量的语句中是否使用子句怎么会很重要?
我们正在使用 Airflow(Apache 项目),其中存在一个名为的类DAG。此类应该用作以下with子句的上下文管理器:
with DAG(**some_parameters) as dag:
do_something_with(dag)
Run Code Online (Sandbox Code Playgroud)
这按预期工作。
但是,在某些情况下,我们不会dag在with子句中使用该变量,因此 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条款或不,如果我完全不使用变量。尽管如此,情况似乎仍然如此。
我已经调查了三个方面:
__enter__()了DAG …您能否建议一种方法来编写可在Python 2.4中使用的"with"语句的替代品?
这将是一个黑客,但它将允许我更好地将我的项目移植到Python 2.4.
编辑: 删除不相关的元类草图
我想让开发人员在Javascript中为一个网站编写一些自定义应用程序,但是我想要沙箱,这样他们就不能做任何顽皮的事情,比如重定向用户,将主体显示设置为无等等.我在Javascript中有一个命名空间他们需要的功能存在于那里,所以我想创建一个沙箱将是一个问题:
with(Namespace) {
//App code goes here where they can only access Namespace.*
}
Run Code Online (Sandbox Code Playgroud)
如何轻松解决这个问题以及可以采取哪些其他方法?宁愿不必审核每个提交的应用程序.
我正在尝试正确使用delphi中的语句.
总的来说,做简单的事情似乎相当简单,但我有兴趣找到一些关于使用嵌套语句的好的代码示例和/或教程.例如
with object1, object2, etc... do
begin
statements
end;
Run Code Online (Sandbox Code Playgroud)
我不确定的是以这种方式使用语句时的优先顺序.
任何建议表示赞赏.
使用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)
我不能看到允许第一个表单的实际问题,通过这个我的意思是实现或逻辑,解析器不应该有逗号的问题(它不会模棱两可),我认为没有逻辑原因为什么不.
在完整的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) 如何在 lambda 中使用上下文管理器?接受黑客攻击。暂缓认为这是 lambda 的错误用法的观点。
我知道我可以这样做:
def f():
with context():
return "Foo"
Run Code Online (Sandbox Code Playgroud)
但我想做这样的事情:
lambda: with context(): "Foo"
Run Code Online (Sandbox Code Playgroud) 我的代码出现以下错误:
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) 而不是使用:
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)
注:关闭,因为游标是很重要的这个。