我有一个通常存储腌制类类型的系统.
我希望能够以相同的方式保存动态参数化的类,但我不能,因为我试图挑选一个非全局发现的类(未在简单代码中定义)得到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
在某些时候(不要问),但是无法破解这个.
如果我不问的话,我觉得我不会忠于蟒蛇精神:如何以相对干净的方式实现这一目标?
我在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)
我一直在遵循说明并运行标准命令:
$ $(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) 我的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
继承自Parent1
和Parent2
,老实说我不知道应该是什么样的正确行为.
有谁知道一个好的,自然的,完成这个的方式?还是我在这里强奸设计?
谢谢
Yonatan
我有一个基类,我从中派生出多个子类.
每个子类定义类常量,我希望对它们强制执行某些限制.例如:
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类树,每个树都由一个抽象基类和许多派生的具体类组成.我希望通过基类方法可以访问所有具体类,并且我不想在子类创建期间指定任何内容.
这就是我想象的解决方案:
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"及其具体类相似的树).
谢谢上网!
我有一个带有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
我一直试图挑选一个包含对静态类方法的引用的对象.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 ×6
class ×3
decorator ×2
inheritance ×2
pickle ×2
amazon-ecs ×1
docker ×1
dynamic ×1
factory ×1
listview ×1
metaclass ×1
pywin32 ×1
registration ×1
windows ×1
wrapper ×1