本文将为您提供关于在with语句中获取要执行的命令块的详细介绍,我们还将为您解释with语句通过什么技术管理python中的资源的相关知识,同时,我们还将为您提供关于c#–switch语句中的变量初始
本文将为您提供关于在with语句中获取要执行的命令块的详细介绍,我们还将为您解释with语句通过什么技术管理python中的资源的相关知识,同时,我们还将为您提供关于c# – switch语句中的变量初始化问题、c# – 在Switch语句中使用String、C#switch语句中的变量声明、git on windows 需要执行的命令的实用信息。
本文目录一览:- 在with语句中获取要执行的命令块(with语句通过什么技术管理python中的资源)
- c# – switch语句中的变量初始化问题
- c# – 在Switch语句中使用String
- C#switch语句中的变量声明
- git on windows 需要执行的命令
在with语句中获取要执行的命令块(with语句通过什么技术管理python中的资源)
在阅读with
语句(链接)的规范时,我想尝试一些事情。这不是针对任何生产代码或任何内容的,我只是在探索,因此,如果这是一个坏主意,请不要太苛刻。
我想做的是在上面的链接文档中抓取一个名为“
BLOCK”的片段,然后在对的调用中进行修改__enter__
。(在动机和总结部分开始之后,请参阅链接的文档。)
这个想法是创建我自己的即时本地命名空间。像这样:
with MyNameSpace(some_object): print a #Should print some_object.a x = 4 #Should set some_object.x=4
基本上,我希望with
块内的语句从属于的局部变量和分配约定some_object
。
在我的特定情况下,some_object
可能是一个特殊的数据数组,它具有我自己的按列操作或类似的操作。在这种情况下,类似的话x = y + 5 ify > 4 else y -2
可能是幕后花哨的NumPy向量化操作,但是我不需要显式调用some_object
这些方法的接口。在命名空间中,表达式应该“正常工作”(但是我将其定义为在MyNameSpace
类中进行推断)。
我的第一个想法是以某种方式中断该with
过程并掌握该try
块中包含的代码。然后__enter__
在调用该代码时解释该代码,并try
用其他内容替换该代码块中的代码(也许pass
可以,但可能会some_object
保留新的更改后的变量恢复到原始变量作用域)。
一个简单的测试用例将是这样的:
my_dict = {''a'':3, ''b'':2}with MyNameSpace(my_dict): print a # Should print 3 x = 5 # When the block finishes, my_dict[''x''] should now be 5
我对这个想法是否已经存在感兴趣。
我知道分配变量的最佳做法。这是一个宠物项目,因此请假设,仅出于这个想法,我们可以忽略最佳实践。即使您不想以这种方式分配变量,在我当前的项目中它也可能很有用。
编辑
为了弄清我可能想做的棘手的事情,并解决以下声称无法完成的回答,请考虑以下示例文件testLocals.py
:
my_dict = {''a'':1, ''b'':2}m = locals()print m["my_dict"][''a'']m["my_dict"][''c''] = 3print my_dictclass some_other_scope(object): def __init__(self, some_scope): x = 5 g = locals() some_scope.update(g) some_scope["my_dict"]["d"] = 4sos = some_other_scope(m)print my_dictprint x
当我非交互式运行它时,它给出以下内容:
ely@AMDESK:~/Desktop/Programming/Python$ python testLocals.py1{''a'': 1, ''c'': 3, ''b'': 2}{''a'': 1, ''c'': 3, ''b'': 2, ''d'': 4}5
答案1
小编典典尝试这个。
import sys class MyNameSpace(object): def __init__(self,ns): self.ns = ns def __enter__(self): globals().update(self.ns) def __exit__(self, exc_type,exc_value,traceback): self.ns.update(sys._getframe(1).f_locals)my_dict = {''a'':3, ''b'':2} with MyNameSpace(my_dict) as ns: print(a) # Should print 3 x = 5 # When the block finishes, my_dict[''x''] should now be 5print(my_dict[''x''])
c# – switch语句中的变量初始化问题
Control myControl; switch(x) { case TabType.Edit: { myControl= ...; } case TabType.View: { myControl= ...; } } myPageView.Controls.Add(myControl);
在这种情况下编译器告诉我
local variable myControl might not be initialized before accessing
那么,避免这种情况的最佳方法是什么?
一种选择是在switch语句之前初始化myControl.但在这种情况下,我再做一次不必要的初始化.
情况1:
Control myControl = null; switch(x) { case TabType.Edit: { myControl= ...; } case TabType.View: { myControl= ...; } } myPageView.Controls.Add(myControl);
下一个选项是使用默认值更改第二种情况.之后编译器将“理解”myControl无论如何都将被初始化并且不会抛出异常.
案例2:
Control myControl; switch(x) { case TabType.Edit: { myControl= ...; } default: { myControl= ...; } } myPageView.Controls.Add(myControl);
但是这种情况看起来并不那么好,因为在我的枚举中添加一些新属性之后,它将对所有其他类型执行默认操作(开发人员很容易忘记在此处更改代码,或者可能没有必要为其他枚举类型初始化myControl) .
在这种情况下,最好的方法是什么?
解决方法
如果您担心可能会引入新的枚举值,那么您可以在default子句中抛出一个有意义的异常.当您稍后尝试取消引用变量时,这将保护您不会出现更模糊的NullReferenceException.
c# – 在Switch语句中使用String
这是我的(大概是不正确的)代码:
string GetPieceCode(GameObject piece) { string pieceCode = ""; Debug.Log(piece.gameObject); pieceCode = piece.ToString().Remove(2,2); Debug.Log(pieceCode); return pieceCode; } Debug.Log(pieceType); switch (pieceType) { case "BP": Debug.Log("Black Pawn Selected"); break; case "WP": Debug.Log("White Pawn Selected"); break; case "WB": print("White Bishop Selected"); break; case "BB": print("Black Bishop Selected"); break; case "WK": print("White Knight Selected"); break; case "BK": print("Black Knight Selected"); break; case "WR": print("White Roook Selected"); break; case "BR": print("Black Rook Selected"); break; case "WKing": print("White King Selected"); break; case "WQueen": print("White Queen Selected"); break; case "BKing": print("Black King Selected"); break; case "BQueen": print("Black Queen Selected"); break; default; debug.log("Error"); break; }
初始Debug.Log(pieceType)打印出一个2字符的字符串代码,表明它与案例值匹配.所以我不知道出了什么问题.
此外,print()和Debug.Log()在此上下文中是相同的.
解决方法
但是,我的所有调试尝试都受到以下事实的影响:我认为(错误地)BP(UnityEngine.GameObject)作为输出仅仅是BP作为带有一些添加的调试信息的字符串.
生成片段代码的正确方法是:
string GetPieceCode(GameObject piece) { string pieceCode = ""; Debug.Log(piece.gameObject); pieceCode = piece.ToString().Substring(0,2); Debug.Log(pieceCode); return pieceCode; }
谢谢大家的帮助.
编辑:虽然不是原始问题的一部分,但我分别使用区分大小写将Kings和Queens的代码更改为B | Wk和B | Wq.
C#switch语句中的变量声明
这个问题已经在这里有了答案 :
C#中的案例声明块级别声明空间 (5个答案)
8个月前关闭。
为什么在C#switch语句中,对于在多种情况下使用的变量,仅在第一种情况下才声明它?
例如,以下内容引发错误“此范围中已经定义了一个名为’variable’的局部变量”。
switch (Type){ case Type.A: string variable = "x"; break; case Type.B: string variable = "y"; break;}
但是,根据逻辑,如果类型为,则不应单击初始声明Type.B
。switch语句中的所有变量是否都在单个作用域中,并且是否在处理任何逻辑之前创建/分配了它们?
答案1
小编典典我相信这与变量的整体范围有关,它是在开关级别定义的块级别范围。
就个人而言,如果您在示例中将值设置为开关内的某项确实有任何好处,则无论如何都需要在开关外声明它。
git on windows 需要执行的命令
<!-- lang: shell -->
git config --global core.filemode false
git config --global core.autocrlf true
第一句是忽略文件权限的改动。
第二句是将文件 checkout 时自动把 LF 转成 CRLF,check in 时自动把 CRLF 转成 LF
今天关于在with语句中获取要执行的命令块和with语句通过什么技术管理python中的资源的分享就到这里,希望大家有所收获,若想了解更多关于c# – switch语句中的变量初始化问题、c# – 在Switch语句中使用String、C#switch语句中的变量声明、git on windows 需要执行的命令等相关知识,可以在本站进行查询。
本文标签: