相关疑难解决方法(0)

如果值已经是字符串,我应该避免转换为字符串吗?

有时您必须使用列表推导将所有内容转换为字符串,包括字符串本身.

b = [str(a) for a in l]
Run Code Online (Sandbox Code Playgroud)

但我必须这样做:

b = [a if type(a)==str else str(a) for a in l]
Run Code Online (Sandbox Code Playgroud)

我想知道str字符串是否足够优化,不能创建另一个字符串副本.

我试过了:

>>> x="aaaaaa"
>>> str(x) is x
True
Run Code Online (Sandbox Code Playgroud)

但这可能是因为Python可以缓存字符串,并重用它们.但是,对于字符串的任何值,这种行为是否得到保证?

python string

51
推荐指数
1
解决办法
4209
查看次数

如何为类定义__str__方法?

在Python中,object该类充当所有(新式)类的根超类.至少默认情况下,应用strrepr任何子类的"类实例" object会产生相同的结果:

>>> class spam(object): pass
... 
>>> str(spam)
"<class '__main__.spam'>"
>>> str(spam) == repr(spam)
Run Code Online (Sandbox Code Playgroud)

我想定义的一个子类object,比方说fancyobject,也就是等同于object以各种方式,不同之处在于施加strreprfancyobject自身产生不同的输出:

>>> class ham(fancyobject): pass
...
>>> str(ham)
'ham'
>>> repr(ham)
"<class '__main__.ham'>"
Run Code Online (Sandbox Code Playgroud)

有没有办法在Python中执行此操作?

PS:我知道__str__特殊的方法,但我的理解是,如果类A重写__str__,那么只有str在实例上调用时才会调用重写方法A,而不是在调用它A本身时调用.即:

>>> class A(object):
...     def __str__(self):
...         return 'from new __str__: ' + object.__str__(self)
... 
>>> str(A())
'from new …
Run Code Online (Sandbox Code Playgroud)

python

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

Python没有捕获MemoryError

我已经用try/except块包装了一些内存不足的代码.但是,虽然生成了MemoryError,但它没有被捕获.

我有以下代码:

    while True:
        try:
            self.create_indexed_vocab( vocab )
            self.reset_weights()
            break;
        except MemoryError:
            # Stuff to reduce size of vocabulary
            self.vocab, self.index2word = None, None
            self.syn0, self.syn1 = None, None

            self.min_count += 1
            logger.info( ...format string here... )
Run Code Online (Sandbox Code Playgroud)

我得到以下Traceback:

File "./make_model_tagged_wmt11.py", line 39, in <module>
  model.build_vocab(sentences)
File "/root/CustomCompiledSoftware/gensim/gensim/models/word2vec.py", line 236, in build_vocab
  self.reset_weights()
File "/root/CustomCompiledSoftware/gensim/gensim/models/word2vec.py", line 347, in reset_weights
  self.syn0 += (random.rand(len(self.vocab), self.layer1_size) - 0.5) / self.layer1_size
File "mtrand.pyx", line 1044, in mtrand.RandomState.rand (numpy/random/mtrand/mtrand.c:6523)
File "mtrand.pyx", line 760, in mtrand.RandomState.random_sample (numpy/random/mtrand/mtrand.c:5713) …
Run Code Online (Sandbox Code Playgroud)

python exception-handling out-of-memory

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

在Python中使用内置str()类型的潜在异常

在Python intfloatPython中使用内置类型时,通常在输入可能不可靠的情况下采用异常处理:

def friendly_int_convert(val):
    "Convert value to int or return 37 & print an alert if conversion fails"
    try:
        return int(val)
    except ValueError:
        print('Sorry, that value doesn\'t work... I chose 37 for you!')
        return 37
Run Code Online (Sandbox Code Playgroud)

使用时是否需要注意任何突出的边缘情况str()

def friendly_str_convert(val):
    "Convert value to str or return 'yo!' & print an alert if conversion fails"
    try:
        return str(val)
    except Exception: # Some specific Exception here
        print('Sorry, that value doesn\'t work... I chose \'yo!\' for you!')
        return 'yo!'
Run Code Online (Sandbox Code Playgroud)

我真的不喜欢使用广泛, …

python string exception-handling built-in python-3.x

5
推荐指数
1
解决办法
203
查看次数

哈希嵌套元组的限制?

演示我所要求的内容的几行代码是:

>>> x = ()
>>> for i in range(1000000):
...     x = (x,)


>>> x.__hash__()

=============================== RESTART: Shell ===============================
Run Code Online (Sandbox Code Playgroud)

1000000 可能过多,但它表明在散列嵌套元组(并且我假设其他对象)时存在某种形式的限制。只是为了澄清,我没有重新启动 shell,当我尝试哈希时它会自动执行此操作。

我想知道这个限制是什么,为什么会发生(以及为什么它没有引发错误),以及是否有解决方法(以便我可以将这样的元组放入集合或字典中)。

python hash python-3.x

5
推荐指数
1
解决办法
336
查看次数