假设我有一个A
具有单一功能的接口。
class A(metaclass=ABCMeta):
@abstractmethod
def spam(self, x: int) -> str:
pass
Run Code Online (Sandbox Code Playgroud)
有类B
和C
实现此接口,但他们不会直接初始化。我将有一些工厂方法(比如),它将返回给我一个合适的对象实现A
. 那么在这种情况下,当我spam
在B
and 中实现时,我C
应该重复类型提示吗?实际上,因为B
和C
没有直接使用,所以类型提示A
似乎就足够了。但我很好奇这种情况下的最佳实践;如果还有其他问题需要考虑。
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)
据我所知,没有记录在案的方法可以这样做,并且有几种可能的方法,但似乎都不理想。
比较type
toAnnotated
不起作用,因为类型提示不是 的实例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) 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__
,因为两个“工厂方法”也使用它。
或者我是否需要使用完全不同的方法。
我有一个使用自定义哈希方法的类.
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
.
我有一个数字列表,将其与长度相对应可得出高斯。我想在这个高斯上计算标准偏差,但是我得到的值(使用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)
我正在尝试使用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) 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.
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设置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.
例如:
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 ×10
type-hinting ×2
collections ×1
gaussian ×1
graph ×1
haskell ×1
input ×1
math ×1
python-3.x ×1
sqlalchemy ×1
statistics ×1
string ×1
sublimetext ×1
variables ×1