小编Yon*_*tan的帖子

Pickle一个动态参数化的子类

我有一个通常存储腌制类类型的系统.

我希望能够以相同的方式保存动态参数化的类,但我不能,因为我试图挑选一个非全局发现的类(未在简单代码中定义)得到PicklingError.

我的问题可以建模为以下示例代码:

class Base(object):
 def m(self):
  return self.__class__.PARAM

def make_parameterized(param_value):
 class AutoSubClass(Base):
  PARAM = param_value
 return AutoSubClass

cls = make_parameterized(input("param value?"))
Run Code Online (Sandbox Code Playgroud)

当我尝试挑选该类时,我收到以下错误:

# pickle.PicklingError: Can't pickle <class '__main__.AutoSubClass'>: it's not found as __main__.AutoSubClass
import pickle
print pickle.dumps(cls)
Run Code Online (Sandbox Code Playgroud)

我正在寻找一些方法来声明Base作为一个ParameterizableBaseClass应该定义所需的params(PARAM在上面的例子中).cls然后,通过保存"ParameterizableBaseClass"类型和不同的param值(param_value上面的动态),可以选择动态参数化子类(上面).

我相信在很多情况下,这可以完全避免......我可以在我的代码中避免这种情况,如果我真的(真的)必须这样做的话.我正在玩__metaclass__,copyreg甚至__builtin__.issubclass在某些时候(不要问),但是无法破解这个.

如果我不问的话,我觉得我不会忠于蟒蛇精神:如何以相对干净的方式实现这一目标?

python factory class dynamic pickle

14
推荐指数
2
解决办法
4071
查看次数

Docker推送到AWS ECR在Windows上失败:没有基本的身份验证凭据

我在windows上使用docker(Docker for Windows,而不是Docker Toolbox)和aws cli in cygwin("git bash")shell.我正在尝试将docker镜像推送到AWS ECR - 私有ECS存储库.

无论我做什么 - 当我跑步时,docker push我反复得到:

no basic auth credentials
Run Code Online (Sandbox Code Playgroud)

方法1

我一直在遵循说明并运行标准命令:

$ $(aws --profile myprofile ecr get-login --region us-east-1)
Login Succeeded
$ docker tag myrepo:latest 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo:latest
$ docker push 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo:latest
The push refers to a repository [232097583865.dkr.ecr.us-east-1.amazonaws.com/potion]
688f61a6956d: Preparing
11908ead416e: Preparing
no basic auth credentials
Run Code Online (Sandbox Code Playgroud)

没有成功.

试图揭示确实,我没有访问权限:

$ docker pull 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo
Using default tag: latest
Pulling repository 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo
unauthorized: authentication required
Run Code Online (Sandbox Code Playgroud)

但是,docker 确实认为我已登录:

$ docker logout https://123456789.dkr.ecr.us-east-1.amazonaws.com …
Run Code Online (Sandbox Code Playgroud)

windows amazon-web-services amazon-ecs docker

10
推荐指数
2
解决办法
2365
查看次数

python父类'包装'子类方法

我的python代码中有以下情况:

class Parent(object):
    def run(self):
        print "preparing for run"
        self.runImpl()
        print "run done"

class Child(Parent):
    def runImpl(self):
        print "child running"
Run Code Online (Sandbox Code Playgroud)

但是,我有几个这样的"装饰",前后"runImpl"后做不同的安装/拆卸步骤,我不喜欢来定义run(),runImpl(),runImplSingleProcess()等.

我正在寻找以下形式的解决方案:

class Parent(object):
    @wrapping_child_call
    def run(self, func_impl, *args, **kwargs)
        print "preparing for run"
        func_impl(*args, **kwargs)
        print "run done"

class Child(Parent):
    def run(self):
        print "child running"
Run Code Online (Sandbox Code Playgroud)

通过这种方式,Child类几乎不需要知道这种情况.

多继承也可能存在问题.如果一个Child继承自Parent1Parent2,老实说我不知道​​应该是什么样的正确行为.

有谁知道一个好的,自然的,完成这个的方式?还是我在这里强奸设计?

谢谢
Yonatan

python inheritance implementation decorator wrapper

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

派生时自动类装饰(或验证)


我有一个基类,我从中派生出多个子类.
每个子类定义类常量,我希望对它们强制执行某些限制.例如:

class Base(object):
    # define these in your sub-class, and make sure (NOM % DENOM == 0)
    NOMINATOR = None
    DENOMINATOR = None

class Subclass_good(Base):
    NOMINATOR = 6
    DENOMINATOR = 3

class Subclass_bad(Base):
    NOMINATOR = 7
    DENOMINATOR = 5
Run Code Online (Sandbox Code Playgroud)

我希望能够执行规则(NOM%DENOM == 0).
我目前使用类装饰器执行此操作:

def nom_denom_validator(cls):
    assert(cls.NOMINATOR % cls.DENOMINATOR == 0)
    return cls

# and decorate each subclass, e.g.:
@nom_denom_validator
class Subclass_another(Base):
    NOMINATOR = 9
    DENOMINATOR = 12
Run Code Online (Sandbox Code Playgroud)

但我不喜欢我需要装饰每个子类的事实(我有很多).我很感兴趣是否可以通过直接对Base类进行一些操作来完成.

有什么建议?

python metaclass class decorator

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

Python:如何在创建时使用父类注册所有子类

我有python类树,每个树都由一个抽象基类和许多派生的具体类组成.我希望通过基类方法可以访问所有具体类,并且我不想在子类创建期间指定任何内容.

这就是我想象的解决方案:

class BaseClassA(object):
    # <some magic code around here>
    @classmethod
    def getConcreteClasses(cls):
        # <some magic related code here>

class ConcreteClassA1(BaseClassA):
    # no magic-related code here

class ConcreteClassA2(BaseClassA):
    # no magic-related code here
Run Code Online (Sandbox Code Playgroud)

尽可能地,我更喜欢将"魔术"写成一种设计模式.我希望能够将它应用于不同场景中的不同类树(即添加一个与"BaseClassB"及其具体类相似的树).

谢谢上网!

python inheritance class registration

4
推荐指数
2
解决办法
1997
查看次数

使用Python从另一个应用程序提取ListView项目

我有一个带有ListView('SysListView32')控件的应用程序,我想从中提取数据。该控件有4列,仅文本数据。

我一直在玩以下几行(在网上某处找到):

VALUE_LENGTH = 256
bufferlength_int=struct.pack('i', VALUE_LENGTH)
count = win32gui.SendMessage(TargetHwnd, commctrl.LVM_GETITEMCOUNT, 0, 0)
for ItemIndex in range(count):
    valuebuffer = array.array('c',bufferlength_int + " " * (VALUE_LENGTH - len(bufferlength_int)))
    ListItems = win32gui.SendMessage(TargetHwnd, commctrl.LVM_GETITEMTEXT, ItemIndex, valuebuffer)
Run Code Online (Sandbox Code Playgroud)

[上面的代码可能不是完全可执行的,因为我从不相关的内容中删除了它。但要旨肯定在这里。]

这似乎运行良好,但是我必须做错了-作为回报,我得到了各种几乎为零的数据缓冲区,而我没有寻找任何实际的文本内容。

有什么建议么?

谢谢,
Yonatan

python listview pywin32 syslistview32

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

在Python中腌制静态方法

我一直试图挑选一个包含对静态类方法的引用的对象.Pickle失败(例如打开module.MyClass.foo)说明它不能被腌制,因为module.foo不存在.
我提出了以下解决方案,使用包装器对象在调用时定位函数,保存容器类和函数名称:

class PicklableStaticMethod(object):
    """Picklable version of a static method.
    Typical usage:
        class MyClass:
            @staticmethod
            def doit():
                print "done"
        # This cannot be pickled:
        non_picklable = MyClass.doit
        # This can be pickled:
        picklable = PicklableStaticMethod(MyClass.doit, MyClass)
    """
    def __init__(self, func, parent_class):
        self.func_name = func.func_name
        self.parent_class = parent_class
    def __call__(self, *args, **kwargs):
        func = getattr(self.parent_class, self.func_name)
        return func(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

我想知道,是否有更好的 - 更标准的方法 - 来腌制这样的物体?我不想对全局pickle进程进行更改(copy_reg例如使用),但以下模式会很棒:class MyClass(object):@ patch_staticmethod def foo():print"done".

我对此的尝试是不成功的,特别是因为我无法从foo函数中提取所有者类.我甚至愿意接受明确的规范(例如@picklable_staticmethod(MyClass)),但我不知道有什么方法可以 …

python static-methods pickle

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