- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想构建一个简单的“DataSource”类,其属性名为“data_source_type”和“data_source_path”。其中“data_source_type”是一个ENUM,“data_source_path”是一个字符串,根据“data_source_type”,我想设置适当的验证,例如“ValidFilePath”或“ValidHttpURL”到“data_source_path”。
我不想编写 IF-ELSE 并拥有意大利面条式数据源类,我想利用“Python 描述符”或任何其他优雅的 Python 结构,这些结构会考虑 SRP(单一职责原则)并支持函数式编程结构.
data_source.py
1 import re
2 from enum import Enum
3 import os
4
5
6 class ValidFilePath(object):
7 def __set__(self, obj, val):
8 if not os.path.exists():
9 raise ValueError("Please enter a valid file path")
10 self.__url = val
11
12 def __get__(self, obj, objtype):
13 return self.__url
14
15
16 class ValidHttpURL(object):
17 def __set__(self, obj, val):
18 if (val is None or re.compile(
19 r'^https?://' # http:// or https://
20 r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|' # domain...
21 r'localhost|' # localhost...
22 r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
23 r'(?::\d+)?' # optional port
24 r'(?:/?|[/?]\S+)$', re.IGNORECASE).search(val) is None):
25 raise ValueError("Please set an valid HTTP(S) URL")
26 self.__url = val
27
28 def __get__(self, obj, objtype):
29 return self.__url
30
31
32 class DataSourceType(Enum):
33 HTTP = 100,
34 LOCAL_FILE = 200,
35 HDFS_FILE = 300
36
37
38 class ValidDataSourceType(object):
39 def __set__(self, obj, val):
40 if val is None or not DataSourceType.__contains__(DataSourceType[val]):
41 raise ValueError("Please set a valid Data Source Type Enum, "
42 " possible values are -> ", [e.name for e in DataSourceType])
43 self.__data_source_type = DataSourceType[val]
44
45 def __get__(self, obj, objtype):
46 return self.__data_source_type
47
48
49 class DataSource(object):
50 data_source_type = ValidDataSourceType()
51 data_source_path = ValidHttpURL()
在第 51 行中,我已经放置了“ValidHttpURL”,我想根据“data_source_type”在其中设置适当的验证描述符
预期行为
ds1 = DataSource()
ds1.data_source_type = 'HTTP'
ds1.data_source_path = 'http://www.google.com'
ds2 = DataSource()
ds2.data_source_type = 'LOCAL_FILE'
ds2.data_source_path = '/var/www/index.html'
print("All is well")
实际行为
ds1 = DataSource()
ds1.data_source_type = 'HTTP'
ds1.data_source_path = 'http://www.google.com'
ds2 = DataSource()
ds2.data_source_type = 'LOCAL_FILE'
ds2.data_source_path = '/var/www/index.html'
**ValueError: Please set an valid HTTP(S) URL**
***更新答案****
1 import os
2 import re
3 from enum import Enum
4 from weakref import WeakKeyDictionary
5
6
7 def valid_file_path(value):
8 if not os.path.exists(value):
9 raise ValueError(value, " is not present. Please make sure the file exists")
10 return value
11
12
13 def valid_http_url(value):
14 if (value is None or re.compile(
15 r'^https?://' # http:// or https://
16 r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|' # domain...
17 r'localhost|' # localhost...
18 r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
19 r'(?::\d+)?' # optional port
20 r'(?:/?|[/?]\S+)$', re.IGNORECASE).search(value) is None):
21 raise ValueError("Please set an valid HTTP(S) URL")
22 return value
23
24
25 class DataSourceType(Enum):
26 NOT_DEFINED = (0, None)
27 HTTP = (100, valid_http_url)
28 LOCAL_FILE = (200, valid_file_path)
29
30 def __init__(self, enum_id, enum_validator):
31 self._id = enum_id
32 self._validator = enum_validator
33
34 @property
35 def validator(self):
36 return self._validator
37
38
39 class ValidDataSourceType(object):
40 def __init__(self):
41 self.default = DataSourceType.NOT_DEFINED
42 self.values = WeakKeyDictionary()
43
44 def __get__(self, instance, owner):
45 return self.values.get(instance, self.default)
46
47 def __set__(self, instance, value):
48 if value is None or not DataSourceType.__contains__(DataSourceType[value]):
49 raise ValueError("Please set a valid Data Source Type Enum, "
50 " possible values are -> ", [e.name for e in DataSourceType])
51 self.values[instance] = DataSourceType[value]
52
53 def __delete__(self, instance):
54 del self.values[instance]
55
56
57 class ValidDataSourcePath(object):
58 def __init__(self, default_data_source_type_field='data_source_type'):
59 self._default = ''
60 self._default_data_source_type_field = default_data_source_type_field
61 self.values = WeakKeyDictionary()
62
63 def __get__(self, instance, owner):
64 return self.values.get(instance, self._default)
65
66 def __set__(self, instance, *value):
67 data_source_type_field = self._default_data_source_type_field
68 value_to_set = None
69
70 if value and len(value) == 1 and isinstance(value[0], str): # user sent only the value
71 value_to_set = value[0]
72 if value and len(value) == 1 and isinstance(value[0], tuple): # user sent the value , and the validation field
73 value_to_set = value[0][0]
74 data_source_type_field = value[0][1]
75
76 _data_source_type = getattr(instance, data_source_type_field, None)
77 if not _data_source_type:
78 raise ValueError(" Valid source path depends on ValidDataSourceType , "
79 " please make sure you have an attribute named ValidDataSourceType")
80 _data_source_type.validator(value_to_set)
81 self.values[instance] = value_to_set
82
83
84 class DataSource(object):
85 data_source_type = ValidDataSourceType()
86 data_source_path = ValidDataSourcePath()
87
88
89 class SomeOtherDomainModel(object):
90 data_source_type_ext = ValidDataSourceType()
91 data_source_path = ValidDataSourcePath()
92
93
94 print(" **************** Scenario 1 - Start **************** ")
95 ds1 = DataSource()
96 ds1.data_source_type = 'HTTP'
97 ds1.data_source_path = "http://www.google.com"
98 print(ds1.data_source_path)
99 print(" **************** Scenario 1 - End **************** ")
100
101 print(" **************** Scenario 2 - Start **************** ")
102 ds2 = SomeOtherDomainModel()
103 ds2.data_source_type_ext = 'HTTP'
104 ds2.data_source_path = ("http://www.yahoo.com", 'data_source_type_ext')
105 print(ds2.data_source_path)
106 print(" **************** Scenario 2 - Start **************** ")
最佳答案
因此,根据我上面的评论,DataSource 的外观如下(使用 @property
),以及验证器类应该只是返回路径是否为 bool 值的函数。有效(如果愿意的话会引发错误)而不是更多描述符:
class DataSource(object):
data_source_type = ValidDataSourceType()
@property
def data_source_path(self):
# can put in a check to make sure _data_source_path exists
return _data_source_path
@data_source_path.setter
def data_source_path(self, path):
if self.data_source_type.validator(path):
self._data_source_path = path
描述符可能很难使用和绕过(我应该知道;我字面上是 wrote the book ),并且当可以找到更简单的解决方案时应该避免使用,所以这就是为什么我将验证器转变为谓词函数。使用 @property
而不是自定义描述符也没有什么可耻的。
关于python - 使用 "Python Descriptors"的条件动态验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47624767/
我有一个用于查找存储设备序列号的内核驱动程序,但该驱动程序存在问题。Descriptor->SerialNumberOffset 为 103但是 (LPCSTR)(UINT_PTR)Descripto
在我的程序中,每当我用导致无法检测到 ORB 功能的东西覆盖相机时,程序就会崩溃并出现错误: OpenCV Error: Assertion failed (type == src2.type() &
定义 通常,一个 descriptor 是具有“绑定行为”的对象属性。所绑定行为可通过 descriptor 协议被自定义的 __get__() , __set__() 和 __delete__(
如 normaluser : $ ulimit -n 4096 -bash: ulimit: open files: cannot modify limit: Operation not permit
我正在尝试在elasticsearch中安装ik分析,ik源来自以下位置: GitHub 我的步骤来自自述文件和来自互联网的一些资料 cd elasticsearch-analysis-ik mvn
我有以下代码: int fds[2]; if (pipe(fds) < 0) { fprintf(stderr, "ERROR, unable to open pipe: %s\n", str
我在 C 中有一个简单的生产者消费者程序,尝试用 fork 解决它当生产者试图在管道上写入时,我得到了错误:我用相同的逻辑编写了另一个程序,但这个程序没有给我任何线索,让我知道为什么? 生产者无法在管
我很难理解 FREAK 描述符中的参数 orientationNormalized 和 scaleNormalized。知道它们的意思或作用吗? OpenCV FREAK 文档:http://docs
我在做的事情是否符合通用设计模式?如果有,名字是什么? 我有一个复杂对象,它具有“简单”字段,例如字符串和字符串列表,以及其他复杂对象。我想将此对象的实例添加到 JMS 消息队列中,这意味着它们需要是
在例子中: event.events = EPOLLIN; event.data.fd = fd; int ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, event
最近,我的 Crashlytics 和 Apple 崩溃日志收到了许多崩溃信息 -[CTTelephonyNetworkInfo updateRat:descriptor:]在没有太多其他信息的情况下
是否有可能将N个文件描述符作为一个文件描述符显示给程序,以便在N个文件描述符(即从N个套接字)中接收的数据将被转发回单个文件描述符上的调用API,从而隐藏它实际上可能来自不同的文件描述符的事实吗?是否
网络编程菜鸟在这里, 我对accept和connect套接字函数的行为感到困惑。在大多数编程语言中,这些函数的包装返回不同类型的值:accept返回可用于发送/接收数据的新描述符,但是connect不
我正在尝试启动resque-web,但是会发生此错误: [Sun Mar 06 05:27:48 +0000 2011]启动“resque-web” ... [Sun Mar 06 05:27:48
我有一个项目,其中有几个为程序集插件编写的自定义描述符。有没有办法一次只运行其中一个描述符而不是整个描述符?我尝试使用文档中的描述符开关 here ,传递到我想要运行的一个描述符的完整路径,但它正在运
我正在尝试学习 POSIX 中的基本 IO 函数,我编写了以下代码,但它不起作用,并且在我尝试执行代码时返回“Bad file descriptor”错误: #include #include #
编辑:最小、完整和可验证的示例位于下面的注释中,代码实际上有效,问题出在不同的区域。抱歉,发帖错误,我现在无法删除它。 我知道,已经有一些关于此的页面,但我确实尝试了所有方法,但没有任何效果。我一直遇
#define MAX 2 int main(){ int mutex = semget(ftok("/usr",'P'),1,IPC_CREAT|0666); int wrt = s
我正在尝试实现一个 simpel c shell,它将通过管道传输任意数量的命令。这是相关的 for 循环: int status; int i,j,inputFile,outputFile,pid;
简介 我典型的swig接口(interface)文件类似如下: %{ //COPY THIS BLOCK AS IS #include static CppClass* get_Cp
我是一名优秀的程序员,十分优秀!