小编Jay*_*hik的帖子

实现接口的类的类型提示

假设我有一个A具有单一功能的接口。

class A(metaclass=ABCMeta):

    @abstractmethod
    def spam(self, x: int) -> str:
        pass
Run Code Online (Sandbox Code Playgroud)

有类BC实现此接口,但他们不会直接初始化。我将有一些工厂方法(比如),它将返回给我一个合适的对象实现A. 那么在这种情况下,当我spamBand 中实现时,我C应该重复类型提示吗?实际上,因为BC没有直接使用,所以类型提示A似乎就足够了。但我很好奇这种情况下的最佳实践;如果还有其他问题需要考虑。

python type-hinting python-3.x

6
推荐指数
1
解决办法
1781
查看次数

检查类型提示是否被注释的正确方法是什么?

Python 3.9 引入了Annotated允许向类型提示添加任意元数据的类,例如,

class A:
    x: Annotated[int, "this is x"]
Run Code Online (Sandbox Code Playgroud)

可以通过设置 的新include_extras参数来获得带注释的类型提示get_type_hints

>>> get_type_hints(A, include_extras=True)
{'x': typing.Annotated[int, 'this is x']}
Run Code Online (Sandbox Code Playgroud)

并且元数据本身可以通过__metadata__类型提示的属性访问。

>>> h = get_type_hints(A, include_extras=True)
>>> h["x"].__metadata__
('this is x',)
Run Code Online (Sandbox Code Playgroud)

但是,我的问题是,测试类型提示是否正确的正确方法 Annotated什么?也就是说,类似于:

if IS_ANNOTATED(h["x"]):
    # do something with the metadata
Run Code Online (Sandbox Code Playgroud)

据我所知,没有记录在案的方法可以这样做,并且有几种可能的方法,但似乎都不理想。

比较typetoAnnotated不起作用,因为类型提示不是 的实例Annotated

>>> type(h["x"])
typing._AnnotatedAlias
Run Code Online (Sandbox Code Playgroud)

所以我们必须这样做:

if type(h["x"]) is _AnnotatedAlias:
    ...
Run Code Online (Sandbox Code Playgroud)

但是,鉴于 中的前导下划线_AnnotatedAlias,这可能需要使用实现细节。

另一种选择是直接检查__metadata__属性:

if hasattr(h["x"], "__metadata__"):
    ... …
Run Code Online (Sandbox Code Playgroud)

python type-hinting python-typing

6
推荐指数
2
解决办法
94
查看次数

Python:初始化类的多种方法

A我有一个可以通过两种不同方式“初始化”的类。因此,我根据本文的第二个答案为其提供了一个“类似工厂”的界面。

class A(object):

    @staticmethod
    def from_method_1(<method_1_parameters>):
        a = A()
        # set parameters of 'a' using <method_1_parameters>
        return a

    @staticmethod
    def from_method_2(<method_2_parameters>):
        a = A()
        # set parameters of 'a' using <method_2_parameters>
        return a
Run Code Online (Sandbox Code Playgroud)

这两种方法非常不同,我不能将它们的参数插入到类的__init__. 因此,类A应该使用以下方式初始化:

a = A.from_method_1(<method_1_parameters>)
Run Code Online (Sandbox Code Playgroud)

或者

a = A.from_method_2(<method_2_parameters>)
Run Code Online (Sandbox Code Playgroud)

但是,仍然可以调用“默认初始化” A

a = A() # just an empty 'A' object
Run Code Online (Sandbox Code Playgroud)

有什么办法可以防止这种情况发生吗?我不能只是NotImplementedError从筹集资金__init__,因为两个“工厂方法”也使用它。

或者我是否需要使用完全不同的方法。

python

4
推荐指数
1
解决办法
5184
查看次数

Python:根据键从集合中获取项目

我有一个使用自定义哈希方法的类.

class Test(object):

    def __init__(self, key, value):
        self.key = key # key is unique
        self.value = value

    def __hash__(self):
        # 'value' is unhashable, so return the hash of 'key'
        return hash(self.key)
Run Code Online (Sandbox Code Playgroud)

我创建了set这个类的使用对象.

t0, t1, t2 = Test(0, 10), Test(1, 5), Test(2, 10)
s = set([t0, t1, t2])
Run Code Online (Sandbox Code Playgroud)

现在,有没有办法从s使用中找到对象key?即我想做:

find_using_key(s, 1) # should return [t1]
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过迭代集合中的项目来做到这一点,但我觉得应该有一个O(1)方法来做到这一点,因为key有效地确定了"位置" set.

python

3
推荐指数
1
解决办法
315
查看次数

计算高斯的标准偏差

我有一个数字列表,将其与长度相对应可得出高斯。我想在这个高斯上计算标准偏差,但是我得到的值(使用np.std()函数)显然太小了(我得到的数值为0.00143…当它应该为8.234时……)。我想我一直在计算y轴上的标准偏差,而不是x轴上的标准偏差(这是应该在标准偏差上进行计算的),但是我对如何做到这一点有些困惑?

我已经包含了我的代码和我要计算std开发的高斯图片。

#max_k_value_counter counts the number of times the maximum value of k comes up.

max_k_value_counter_sum = sum(max_k_value_counter)
prob_max_k_value = [0] * len(max_k_value_counter)

# Calculate the probability of getting a particular value for k
for i in range(len(max_k_value_counter)):
        prob_max_k_value[i] = float(max_k_value_counter[i]) / max_k_value_counter_sum

print "Std dev on prob_max_k_value", np.std(prob_max_k_value)

# Plot p(k) vs k_max to calculate the errors on k
plt.plot(range(len(prob_max_k_value)), prob_max_k_value)
plt.xlim(0, 200)
plt.xlabel(r"$k$", fontsize=16)
plt.ylabel(r"$p(k)$", fontsize=16)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

python math statistics graph gaussian

3
推荐指数
1
解决办法
4180
查看次数

AttributeError:'Session'对象没有属性'save'

我正在尝试使用SQLAlchemy,但是在行中:

session.save(login)
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

AttributeError: 'Session' object has no attribute 'save'
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

def findOrCreateLogin(self, username, password):
    login = self.findLogin(username)
    if login:
        return login
    else:
        login = DBLogin(username,password)
        session.save(login)
        return login
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

2
推荐指数
1
解决办法
3008
查看次数

为什么模块数学被称为“内置”?

AFAIK,Pythonbuiltins指的是以下中包含的异常和函数__builtins__

>>> import builtins  # import __builtin__ in Python 2
>>> dir(builtins)  # dir(__builtin__) for Python 2
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
...many more...
'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed',
'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum',
'super', 'tuple', 'type', 'vars', 'zip']
Run Code Online (Sandbox Code Playgroud)

但看看下面的代码(Python2 和 3 都给出了相同的结果):

>>> globals()
{'__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>,
 '__loader__': <class '_frozen_importlib.BuiltinImporter'>,
 '__doc__': None, '__package__': None}
>>> import threading
>>> import math
>>> globals()
{'__name__': …
Run Code Online (Sandbox Code Playgroud)

python

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

Python:没有.字符串中每个字符的出现次数

可能重复:
如何使用python获取每个字符的出现次数

获取字符串中每个字符的计数并存储它的最佳方法是什么(我正在使用字典 - 这个选择能产生很大的不同吗?)?我想到的几种方式:

1.

for character in string:
    if character in characterCountsDict:
        characterCountsDict[character] += 1
    else:
        characterCountsDict[character] = 1
Run Code Online (Sandbox Code Playgroud)

2.

character = 0
while character < 127:
    characterCountsDict[str(unichr(character))] = string.count(str(unichr(character))
    character += 1
Run Code Online (Sandbox Code Playgroud)

我认为第二种方法更好......但它们中哪一方好?有没有更好的方法来做到这一点?

python string collections

0
推荐指数
1
解决办法
396
查看次数

Sublime尝试将Python脚本编译为Haskell脚本

我是新手,请不要对我苛刻.

我正在尝试用Python设置Sublime Text(下一学期).在此之前我在SublimeText中使用了Haskell,在Sublime中我可以用"ctrl + b"运行我的skript.

当我尝试使用名为"test.py"的文件执行相同操作时.

  def add(a,b):

      return a+b

  main = print(add(2,3))
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:

/home/nayooti/Desktop/test.py:1:1:
    **Parse error: naked expression at top level**
[Finished in 0.2s with exit code 1]
[shell_cmd: runhaskell "/home/nayooti/Desktop/test.py"]
[dir: /home/nayooti/Desktop]
[path: /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games]
Run Code Online (Sandbox Code Playgroud)

"顶层的裸体表达" - 部分看起来很熟悉,因为它非常具有Haskell特性.实际上,当我在Web上搜索这个消息的时候,它只会带给我与Haskell相关的东西.显然,Sublime或者编译器认为,我正在尝试运行Haskell脚本,即使我将文件命名为〜.py.

对于这些,不熟悉Haskell和Python的人:通常可以运行脚本:Python:main = print(method(x,y))Haskell:main = print(function xy)

我使用的是Ubuntu 12.04.我在这做错了什么?非常感谢帮助.TX.

python haskell sublimetext

-1
推荐指数
1
解决办法
164
查看次数

如何编写一个会询问您姓名的程序,然后显示"Hello Name",其中"name"是您在python 3.3.4中输入的名称?

例如:

What is your name?
Anna
Hello Anna
Run Code Online (Sandbox Code Playgroud)

我已经尝试了一些东西;

print
var = (input("What is your name? ")
print:("you entered", var) 
Run Code Online (Sandbox Code Playgroud)

但我收到的只是语法无效.

python variables input

-3
推荐指数
1
解决办法
9244
查看次数