小编Sła*_*art的帖子

在Python中创建单例

这个问题不是讨论单身人士设计模式是否可取,反模式,还是任何宗教战争,而是讨论如何以最蟒蛇的方式在Python中最好地实现这种模式.在这种情况下,我将"最pythonic"定义为表示它遵循"最小惊讶原则".

我有多个类可以成为单例(我的用例是记录器,但这并不重要).当我可以简单地继承或装饰时,我不希望在添加gumph的几个类中混乱.

最好的方法:


方法1:装饰者

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)

优点

  • 装饰器的添加方式通常比多重继承更直观.

缺点

  • 虽然使用MyClass()创建的对象将是真正的单例对象,但MyClass本身是一个函数,而不是一个类,因此您无法从中调用类方法.也是为了m = MyClass(); n = MyClass(); o = type(n)();那时m == n && m != o && n != o

方法2:基类

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)

python singleton metaclass decorator base-class

829
推荐指数
14
解决办法
29万
查看次数

envsubst有逃脱角色吗?

有没有办法防止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)

这样做有什么逃避特征吗?

bash shell envsubst

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

如何合并Docker的各层镜像并瘦身镜像文件

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)

docker

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

python:常规方法和classmethod之间的混合

有时我需要用静态方法编写类,但有可能初始化它并保持状态(对象)

......喜欢:

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.

python methods decorator class-method python-decorators

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

使用线程和进程并发写入同一文件

什么是正确的解决方案,以确保在使用许多线程和进程时文件永远不会被破坏.

线程版本,关心打开错误.

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.我不确定上面的代码是否需要嵌套尝试以防写入失败,我们想要关闭打开的文件(如果在锁定释放后它将保持打开状态)

python multithreading synchronization multiprocessing

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

在vim中进行垂直编辑 - 替换文本

如果我想在我使用的许多行中键入相同的文本: 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)

vim

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

检查 python 的类型模块中范围的类型

这是关于失踪typing.Range

range包中没有 for 类型typing,但同时我们看到typing.re.Match,这是一个面向包的类型。ortyping.sequencetyping.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: ranger: typing.Iterable或创建自定义别名

类型提示和类型检查之间的区别在这里并不重要。

python type-hinting python-3.x

8
推荐指数
2
解决办法
8362
查看次数

Django-迁移时模型的不可用字段

也许我筋疲力尽,看不到简单的东西,但是在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)

python migration django

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

将许多参数传递给 django 游标的一个占位符(IN 中的占位符)

我的意思是这样的:

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)

而且用占位符似乎很难实现。

python sql django placeholder

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

从 Postgresql 表中选择不同的数组值

我有一个 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 格式。

postgresql distinct distinct-values

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

PayPal即时付款通知IPN,空POST

我使用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的工作原理.
  • 请求处理没问题 - 用curl测试.
  • 在paypal上的IPN消息的历史是可以的.

我忘记了什么吗?

请确认或拒绝您的IPN上的PayPal问题.

paypal paypal-ipn

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

像Python一样的范围,可踏入纯Java

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内置库而不是第三方库。在添加我自己的内容之前,我已经检查了该问题和答案。差异是微妙的但必不可少的。

java range

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