这个问题不是讨论单身人士设计模式是否可取,反模式,还是任何宗教战争,而是讨论如何以最蟒蛇的方式在Python中最好地实现这种模式.在这种情况下,我将"最pythonic"定义为表示它遵循"最小惊讶原则".
我有多个类可以成为单例(我的用例是记录器,但这并不重要).当我可以简单地继承或装饰时,我不希望在添加gumph的几个类中混乱.
最好的方法:
def singleton(class_):
instances = {}
def getinstance(*args, **kwargs):
if class_ not in instances:
instances[class_] = class_(*args, **kwargs)
return instances[class_]
return getinstance
@singleton
class MyClass(BaseClass):
pass
Run Code Online (Sandbox Code Playgroud)
优点
缺点
m = MyClass(); n = MyClass(); o = type(n)();
那时m == n && m != o && n != o
class Singleton(object):
_instance = None
def __new__(class_, *args, **kwargs):
if not isinstance(class_._instance, class_):
class_._instance = object.__new__(class_, *args, **kwargs)
return class_._instance
class MyClass(Singleton, …
Run Code Online (Sandbox Code Playgroud) 有没有办法防止envsubst
替代$VARIABLE
?例如,我希望有类似的东西:
export THIS=THAT
echo "dont substitute \\\$THIS" | envsubst
Run Code Online (Sandbox Code Playgroud)
并让它回来
dont substitute $THIS
Run Code Online (Sandbox Code Playgroud)
但我得到了
dont substitute \THAT
Run Code Online (Sandbox Code Playgroud)
这样做有什么逃避特征吗?
docker image inspect <name>
给我 16GB
以及大约20层
当我以 root 身份登录时,这
du -hs /
仅显示 2GB
仅供参考,Dockerfile 中已经有非常多行的 RUN 命令。
我可以将所有层压缩为一层而不触及 Dockerfile、重建等吗?
或者可能通过向 Dockerfile 添加额外的操作来清除/改进缓存
Dockerfile
是
FROM heroku/heroku:18
ENV PYENV_ROOT="/pyenv"
ENV PATH="/pyenv/shims:/pyenv/bin:$PATH"
ENV PYTHON_VERSION 3.5.6
ENV GPG_KEY <value>
ENV PYTHONUNBUFFERED 1
ENV TERM xterm
ENV EDITOR vim
RUN apt-get update && apt-get install -y \
build-essential \
gdal-bin \
binutils \
iputils-ping \
libjpeg8 \
libproj-dev \
libjpeg8-dev \
libtiff-dev \
zlib1g-dev \
libfreetype6-dev \
liblcms2-dev \
libxml2-dev …
Run Code Online (Sandbox Code Playgroud) 有时我需要用静态方法编写类,但有可能初始化它并保持状态(对象)
......喜欢:
class A:
@classmethod
def method(cls_or_self):
# get reference to object when A().method() or to class when A.method()
code
Run Code Online (Sandbox Code Playgroud)
我现在拥有的是:
class A:
def method(self = None, *params): code
# or
def method2(self = None, **params): code
# but what I need is rather normal parameters, not optional and named args:
def method3(self_or_cls, a, b=1, c=2, *p, **kw): code
Run Code Online (Sandbox Code Playgroud)
请不要写关于staticmethod和classmethod之间的区别.我感兴趣的是,如果存在这样的装饰器(在或多或少的标准库中),而且如果上面适合于PEP.
什么是正确的解决方案,以确保在使用许多线程和进程时文件永远不会被破坏.
线程版本,关心打开错误.
lock = threading.RLock()
with lock:
try:
f = open(file, 'a')
try:
f.write('sth')
finally:
f.close() # try close in any circumstances if open passed
except:
pass # when open failed
Run Code Online (Sandbox Code Playgroud)
对于进程,我猜必须使用multiprocessing.Lock
但如果我想要2个进程,并且第一个进程拥有2个线程(每个进程使用一个文件)
只有理论,但我想知道如何将同步与线程和进程混合.线程是否从进程"继承"它,所以只需要进程之间的同步?
2.我不确定上面的代码是否需要嵌套尝试以防写入失败,我们想要关闭打开的文件(如果在锁定释放后它将保持打开状态)
如果我想在我使用的许多行中键入相同的文本:
ctrl-v
,然后I
,键入,esc
所以我可以快速改变:
aaa
bbb
ccc
ddd
...
Run Code Online (Sandbox Code Playgroud)
至:
123aaa
123bbb
123ccc
123ddd
...
Run Code Online (Sandbox Code Playgroud)
但如果我del
在打字时使用它就无法工作.我必须分2步执行列替换:从列(ctrl-v
+ x
)中删除不需要的字符,然后键入如上所示.
是否有可能改进编辑并在单一操作中完成?......喜欢:
aaa
bbb
ccc
ddd
...
Run Code Online (Sandbox Code Playgroud)
至:
123aa
123bb
123cc
123dd
...
Run Code Online (Sandbox Code Playgroud) 这是关于失踪typing.Range
。
range
包中没有 for 类型typing
,但同时我们看到typing.re.Match
,这是一个面向包的类型。ortyping.sequence
太typing.Iterable
宽泛。
有没有更好的方法来检查range
类型和仅range
类型?除了使用:
range_instance.__class__ == range
Run Code Online (Sandbox Code Playgroud)
更新:
需要明确的是,我的意思是打字中的某些类型包括某事物的所有元素或方面,例如typeing.Iterable
(通用类型,这很好)
另一方面,也有非常具体的类型,例如
typing.Generator
, typing.Tuple
, typing.Dict
, typing.re.Match
typing.AsyncContextManager
, ...
但不是
typing.Range
事实 1:range
类型是 Python 中的不同类型(例如,范围具有额外的优化来检查其中的元素,有时知道您正在处理列表还是范围是有意义的)
事实 2:typing
模块似乎涵盖了类型的所有方面。(如果您有疑问,请参阅那里的导入和逻辑)
知道这一点,我认为typing.Range
是缺失的。
否则,人们会对使用哪一个感到困惑:
r: range
或r: typing.Iterable
或创建自定义别名
类型提示和类型检查之间的区别在这里并不重要。
也许我筋疲力尽,看不到简单的东西,但是在Django 1.9.7中,在进行迁移时,我发现了一些奇怪的东西,并且我正在寻找解释。
在RunPython操作中通过apps
(是(django.db.migrations.state.StateApps
)获取模型类时,我拥有AttributeError
该字段。
我的模特:
class Weight(models.Model):
INF = 2**31-1
minimum = models.PositiveIntegerField()
maximum = models.PositiveIntegerField()
carrier = models.ForeignKey(Carrier)
class Meta:
ordering = ['carrier__name', 'minimum']
Run Code Online (Sandbox Code Playgroud)
在从中运行的迁移方法中RunPython
,我有:
Weight = apps.get_model('calc.Weight')
Run Code Online (Sandbox Code Playgroud)
然后有例外,但仅适用于某些领域。
从调试(由RunPython运行的内部方法)中:
>>> Weight.maximum
Traceback (most recent call last):
File "<pudb command line>", line 1, in <module>
AttributeError: type object 'Weight' has no attribute 'maximum'
>>> Weight.minimum
Traceback (most recent call last):
File "<pudb command line>", line 1, in <module>
AttributeError: type object 'Weight' …
Run Code Online (Sandbox Code Playgroud) 我的意思是这样的:
from django.db import connection
cursor=connection.cursor()
cursor.execute('SELECT * FROM mytable where id IN (%s)', [params])
Run Code Online (Sandbox Code Playgroud)
参数不能只是可迭代的——它不起作用。由于数据库处理程序转义值,因此也不能采用 CSV 格式。
如何在 中使用占位符IN
?
CSV 是错误的,我的意思是params=['1','2','3','4','5']
c.execute('select * from mytable where id in (%s)', [','.join(params)])
Run Code Online (Sandbox Code Playgroud)
将产生:
select * from mytable where id in ('1,2,3,4,5')
Run Code Online (Sandbox Code Playgroud)
但正确的sql是:
select * from mytable where id in (1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)
而且用占位符似乎很难实现。
我有一个 PostgreSQL 数据库表,它看起来像这样
content
title category content
Hello World ["Great"] This is the content
Learn More ["Learn", "Great"] Learn about things
Run Code Online (Sandbox Code Playgroud)
我知道这不是存储此类数据的最佳方式,但此时无法更改。
我想在一个查询中获得一组独特的类别,如下所示:
SELECT DISTINCT category FROM content
最后得到一个这样的数组:
["Great", "Learn"]
我知道如果类别在单独的表中会很容易,但是如果它们像这样嵌套,你会怎么做?
category
是 JSONB 格式。
我使用paypal订阅(托管按钮)
auto-return for Website Payments is on
Payment Data Transfer is on
success, fail and notify url are different
extra params for button are:
rm=2
notify_url=<url>
sra=1
rest in PayPal is default.
Run Code Online (Sandbox Code Playgroud)
所有在pro和sandbox中都有效
但来自IPN的POST请求每次都带有空数据.
我忘记了什么吗?
请确认或拒绝您的IPN上的PayPal问题.
In [1]: range(-100, 100, 20)
Out[1]: [-100, -80, -60, -40, -20, 0, 20, 40, 60, 80]
Run Code Online (Sandbox Code Playgroud)
Array
使用Java标准库而不是编写自己的函数,最简单的创建方法是什么?
有IntStream.range(-100, 100)
,但步骤已硬编码为1。
这不是Java的重复:是否等效于Python的range(int,int)?,因为我需要step
在数字之间添加一个(offset),并希望使用Java内置库而不是第三方库。在添加我自己的内容之前,我已经检查了该问题和答案。差异是微妙的但必不可少的。
python ×6
decorator ×2
django ×2
base-class ×1
bash ×1
class-method ×1
distinct ×1
docker ×1
envsubst ×1
java ×1
metaclass ×1
methods ×1
migration ×1
paypal ×1
paypal-ipn ×1
placeholder ×1
postgresql ×1
python-3.x ×1
range ×1
shell ×1
singleton ×1
sql ×1
type-hinting ×1
vim ×1