我发现,比较的结果keys()和values()方法的dict内置在自己产生不一致的结果:
instance = {'one': 1}
instance.values() == instance.values() # Returns False
instance.keys() == instance.keys() # Returns True
Run Code Online (Sandbox Code Playgroud)
在Python 2.7中运行上述代码将对两个调用都返回True,这使我相信Python 3的一些实现细节dict_values会导致这种奇怪的行为。
是否有这种行为的原因,或者我偶然发现了一些晦涩的错误?
这让我发疯。下面是一个class我正在搞乱的,目标是有一种支持动态属性分配的方法。 请暂时忘记糟糕的实现或为什么我不只使用字典,我知道还有其他方法可以做到这一点(例如Enum)但这是我之前的测试代码,现在它成为我寻找原因的追求不工作。
class Family(object):
def children(self):
return self.__dict__.values()
def __setitem__(self, key, value):
self.__dict__[key] = value
def __getitem__(self, item):
return self.__dict__[item]
def __repr__(self):
return str(self.__dict__)
def __iter__(self):
return self.__dict__.items()
Run Code Online (Sandbox Code Playgroud)
这一切看起来都很好,我启动了一个测试对象,如下所示:
foo = Family()
foo.a = 'foo'
foo.b = 'bar'
[i for i in foo]
Run Code Online (Sandbox Code Playgroud)
现在预期的结果是[('a', 'foo'), ('b', 'bar')],但我得到的是:
TypeError: iter() returned non-iterator of type 'dict_items'
我想我可能把__iter__方法搞砸了,所以我检查如下:
type(foo.__iter__())
# <class 'dict_items'>
type(foo.__dict__.items())
# <class 'dict_items'>
[i for i in foo.__dict.__items()]
# [('a', 'foo'), …Run Code Online (Sandbox Code Playgroud) 我想要一个快速而又脏的方法来获取一些文件名而无需在我的shell中输入,所以我有以下代码:
from tkinter.filedialog import askopenfile
file = askopenfile()
Run Code Online (Sandbox Code Playgroud)
现在,这一切工作正常,但它确实创造一个多余的tkinter,需要关闭GUI.我知道我可以这样做来压制它:
import tkinter as tk
tk.Tk().withdraw()
Run Code Online (Sandbox Code Playgroud)
但这并不意味着它没有装在背上.它只是意味着现在有一个Tk()我无法关闭/销毁的对象.
似乎每次我创建一个Tk(),无论我del或destroy()它,内存都没有被释放.见下文:
import tkinter as tk
import os, psutil
process = psutil.Process(os.getpid())
def mem(): print(f'{process.memory_info().rss:,}')
# initial memory usage
mem()
# 21,475,328
for i in range(20):
root.append(tk.Tk())
root[-1].destroy()
mem()
# 24,952,832
# 26,251,264
# ...
# 47,591,424
# 48,865,280
# try deleting the root instead
del root
mem()
# 50,819,072
Run Code Online (Sandbox Code Playgroud)
正如所看到的,蟒蛇甚至没有的每个实例后腾出的使用Tk()被破坏和root小号删除.然而,这不是其他对象的情况: …
假设我在EXCEL VBA UserForm中有以下代码:
Private Sub TextBox_Change()
TextBox.Value = UCase(TextBox.Value)
OtherText.Value = "FOO " & TextBox.value & " BAR"
End Sub
Run Code Online (Sandbox Code Playgroud)
它强制文本框始终为大写,并且当用户从末尾键入时效果很好.
然而,我说我得到了一个文本"HELLO WORLD",我想在其间插入 "CRUEL "(由用户手动输入),一旦我输入C,光标将跳转到后面D,最终结果将成为"HELLO CWORLDRUEL "(如果我盲目输入).
如果我有大写锁定,光标位置不会改变,但它会破坏代码的目的......并且使用小写字符它总是将光标踢到最后.
有没有办法保持这些类型的强制案例更改的光标位置?
我曾考虑使用_Exit()方法,但我确实希望每次更改都保持值OtherText和TextBox值大写.否则OtherText将全部为大写,而TextBox在_Exit()执行之前仍然是小写,它看起来......不合需要.
我正在尝试进行一种不需要精确返回输出的列表查找。我希望能够输入任意数量的字母,然后让程序返回一个匹配的单词。
words=["apple","banana","orange"]
Run Code Online (Sandbox Code Playgroud)
如果用户输入“ng”,它将返回橙色。但是如果用户输入“an”,香蕉和橙子就会返回。“a”将返回此列表中的所有项目。我一直在尝试用谷歌搜索这个,但显然我没有提出正确的问题。任何帮助,将不胜感激