标签: with-statement

C++是否有像Pascal这样的"with"关键字?

withPascal中的关键字可用于快速访问记录的字段.有谁知道C++是否有类似的东西?

例如:我有一个包含许多字段的指针,我不想这样输入:

if (pointer->field1) && (pointer->field2) && ... (pointer->fieldn)
Run Code Online (Sandbox Code Playgroud)

我真正想要的是C++中的这样的东西:

with (pointer)
{
  if (field1) && (field2) && .......(fieldn)
}
Run Code Online (Sandbox Code Playgroud)

c++ pascal with-statement

18
推荐指数
8
解决办法
2万
查看次数

Python条件"有"锁设计

快速提问,希望......

我正在尝试使用with语句进行一些共享锁定

def someMethod(self, hasLock = False):
     with self.my_lock:
         self.somethingElse(hasLock=True)


def somethingElse(self, hasLock = False):
    #I want this to be conditional...
    with self.my_lock:
          print 'i hate hello worlds"
Run Code Online (Sandbox Code Playgroud)

有道理?我基本上只想做IF*我还没有锁..

除了能够实现这一点,它是一个糟糕的设计?我应该自己获得/释放吗?

这似乎是那些脑屁问题之一..

python locking with-statement

18
推荐指数
2
解决办法
5万
查看次数

let块语句和带有语句的等效语句有什么区别?

已过时

let语句的块版本在最终确定之前从ES6中删除,并且已从支持它的浏览器中删除.这个问题现在只具有历史意义.

使用ECMAScript 6 let块语句和使用with具有等效对象文字的语句之间有什么区别吗?

使用let声明

var x = 10;
let (x = x * 10,
     y = x + 5) {
    console.log("x is " + x + ", y is " + y);
}
Run Code Online (Sandbox Code Playgroud)

使用with声明

var x = 10;
with ({x: x * 10,
       y: x + 5}) {
    console.log("x is " + x + ", y is " + y);
    // writes "x is 100, y is 15"
}
Run Code Online (Sandbox Code Playgroud)

javascript language-features let with-statement ecmascript-6

18
推荐指数
2
解决办法
1346
查看次数

SyntaxError:'with'语句在严格模式下无效

当我尝试从断点处做任何事情时,我在safari控制台中收到此错误.Bug报告:https://bugs.webkit.org/show_bug.cgi?id = 83267

有没有人有解决方法?由于我假设的原因与此相关,javascript已停止在我的网站上运行safari.

编辑:错误报告还包含repro步骤.

另一个编辑:我没有使用"with"语句.这是safari控制台的一个错误.

javascript safari with-statement deprecation-warning

18
推荐指数
1
解决办法
8465
查看次数

Python __enter__/__exit__ vs __init __(或__new__)/ __del__

我已经搜索过了,我无法想出任何使用python的__enter__/ __exit__而不是__init__(或__new__?)/的理由__del__.

我理解__enter__//__exit__旨在与with语句一起用作上下文管理器,with声明很棒.但与此相对应的是,这些块中的任何代码在该上下文中执行.通过使用这些而不是__init__/ __del__我似乎与他们必须使用的调用者创建隐式契约with,但是没有办法强制执行这样的契约,并且合同只通过文档(或阅读代码)传达.这似乎是一个坏主意.

我似乎使用__init__/ __del__with块内部获得相同的效果.但是通过使用它们而不是上下文管理方法,我的对象在其他场景中也很有用.

因此,任何人可以想出为什么我会一个令人信服的理由以往任何时候都需要使用上下文的管理方法,而不是构造函数/析构函数的方法呢?

如果有更好的地方可以提出这样的问题,请告诉我,但似乎没有太多关于此的信息.

跟进:

这个问题是基于一个糟糕的(但可能是常见的)假设,因为我总是习惯于with实例化一个新对象,在这种情况下__init__/__del__非常接近于相同的行为__enter__/__exit__(除非您无法控制何时或是否__del__将被执行,它是直到垃圾收集,如果进程终止,它可能永远不会被调用).但是如果你在with语句中使用预先存在的对象,它们当然是完全不同的.

python constructor destructor with-statement contextmanager

18
推荐指数
2
解决办法
7969
查看次数

使用/作为上下文管理器打开文件列表

注意:我知道

with open('f1') as f1, open('f2') as f2:
    ...
Run Code Online (Sandbox Code Playgroud)

句法.这是一个不同的问题.


给定一个字符串列表file_names有一种方法可以使用with/ as打开每个文件名,使用一行.像这样的东西:

with [open(fn) for fn in file_names] as files:
    # use the list of files
Run Code Online (Sandbox Code Playgroud)

这当然不起作用,因为它试图在列表上使用上下文管理器.在运行时之前可能无法知道列表的长度,例如sys.argv[1:]

python with-statement contextmanager

17
推荐指数
2
解决办法
2446
查看次数

python'with'语句,我应该使用contextlib.closing吗?

from contextlib import closing

def init_db():
    with closing(connect_db()) as db:
        with app.open_resource('schema.sql') as f:
            db.cursor().executescript(f.read())
        db.commit()
Run Code Online (Sandbox Code Playgroud)

这是来自烧瓶教程第3步(http://flask.pocoo.org/docs/tutorial/dbinit/#tutorial-dbinit).我对第4行感到好奇.

我必须导入并使用'contextlib.closing()'方法吗?

当我语句学习,很多文章说它会在下面的过程之后自动关闭文件.(与Last:thing.close()相同)

with open('filename','w') as f:
    f.write(someString);
Run Code Online (Sandbox Code Playgroud)

即使我不使用下面的contextlib.closing(),有什么区别?它来自2.7.6版本,谢谢.

def init_db():
    with connect_db() as db:
        with app.open_resource('schema.sql') as f:
            db.cursor().executescript(f.read())
        db.commit()
Run Code Online (Sandbox Code Playgroud)

python with-statement contextmanager

17
推荐指数
2
解决办法
7441
查看次数

python 内置的 __exit__ 参数类型是什么?

类具有__exit__允许实现上下文管理器的可定义函数。

它需要所需的参数:

def __exit__(self, exc_type, exc_val, exc_tb):
Run Code Online (Sandbox Code Playgroud)

但我找不到这些论点是什么及其类型的明确定义。

这是我对它们是什么以及为什么的最佳猜测,但我不完全确定:

def __exit__(self, exc_type: Exception, exc_val: TracebackException, exc_tb: TracebackType):
Run Code Online (Sandbox Code Playgroud)

exc_type

蟒限定了TracebackException一个接受一个类exc_type,其中内容使用在构造参数issubclassSyntaxError,这推断出exc_type确实是某种Exception,其SyntaxError从继承。

exc_val

此外,在TracebackException类是exc_value符合了我们的说法exc_val似乎有不同的属性,如__cause____context__和那些在所有定义的其他属性TracebackType本身。这让我觉得参数本身就是TracebackException.

exc_tb

蟒限定walk_tb函数使用exc_tb作为参数(手动地从跟踪docs.python.org),并且该对象似乎具有tb_frametb_linenotb_next其可追溯到一个属性TracebackType在类typeshed库。

想法?

python exception with-statement traceback python-3.x

16
推荐指数
2
解决办法
2842
查看次数

如何在With ... End With中访问对象本身

一些代码来说明我的问题:

With Test.AnObject

    .Something = 1337
    .AnotherThing = "Hello"

    ''// why can't I do this to pass the object itself:
    Test2.Subroutine(.)
    ''// ... and is there an equivalent, other than repeating the object in With?

End With
Run Code Online (Sandbox Code Playgroud)

vb.net with-statement

15
推荐指数
3
解决办法
5121
查看次数

多处理返回"太多打开的文件",但使用`with ... as`修复它.为什么?

我正在使用这个答案,以便在Linux机器上运行Python中的多处理并行命令.

我的代码做了类似的事情:

import multiprocessing
import logging

def cycle(offset):
    # Do stuff

def run():
    for nprocess in process_per_cycle:
        logger.info("Start cycle with %d processes", nprocess)
        offsets = list(range(nprocess))
        pool = multiprocessing.Pool(nprocess)
        pool.map(cycle, offsets)
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个错误:OSError: [Errno 24] Too many open files
所以,代码打开了太多文件描述符,即:它启动了太多进程而没有终止它们.

我修了它用这些线代替最后两行:

    with multiprocessing.Pool(nprocess) as pool:
        pool.map(cycle, offsets)
Run Code Online (Sandbox Code Playgroud)

但我不知道为什么这些线路修复了它.

在那下面发生了with什么?

python multiprocessing with-statement process-pool

15
推荐指数
1
解决办法
9614
查看次数