如何判断字符串是不是键值对
如题 本帖最后由 jackz007 于 2022-11-30 15:23 编辑说清楚,是什么东西用的键值对?你举一个这样字符串的例子看看呢 本帖最后由 Mefine 于 2022-11-30 16:31 编辑
jackz007 发表于 2022-11-30 15:22
说清楚,是什么东西用的键值对?你举一个这样字符串的例子看看呢
比如下面这种程序,我还需要判断传入参数如果是字符串,那么是不是键值对,如何去判断
class Testdemo(object):
def __init__(self,data):
self.__data = data
# self.__params = params
# self.__method = method
# self.__url = url
# self.__headers = headers
# self.__json = json
# self.__files = files
@property
def data(self):
return self.__data
@data.setter
def data(self, va1):
if type(va1) is not dict or str:
print('必须是字典或字符串')
return
self.__data = va1
obj1 = Testdemo({"a": "1", "b": "2"})
print(obj1.data) 本帖最后由 jackz007 于 2022-11-30 17:18 编辑
这种类装饰器暂时属于本人知识盲区,无法发表意见,但是,这个语句肯定存在问题:
if type(va1) is not dict or str:
应该改为
if type(va1) != dict and type(va1) != str : jackz007 发表于 2022-11-30 17:17
这种类装饰器暂时属于本人知识盲区,无法发表意见,但是,这个语句肯定存在问题:
应该 ...
明白,语句判断确实写的有点问题。。谢谢~
主要问题还是在于if语句如何判断给定字符串是否是键值对,这个不知道怎么判断。。求大佬解惑{:10_319:} Mefine 发表于 2022-11-30 18:23
明白,语句判断确实写的有点问题。。谢谢~
主要问题还是在于if语句如何判断给定字符串是否是键值对, ...
难道用 type() 判断对象类型还不够用? jackz007 发表于 2022-11-30 18:29
难道用 type() 判断对象类型还不够用?
就是不确定够不够用,在小甲鱼的速查宝典看了type基本用法:
>>> # 第一种用法
>>> type(250)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("FishC")
<class 'str'>
>>> class C:
... def __init__(self, x):
... self.x = x
...
>>> c = C(250)
>>> c
<__main__.C object at 0x0000025724952FD0>
>>> d = type(c)(520)
>>> d
<__main__.C object at 0x0000025724952C70>
>>> # 第二种用法
>>> C = type('C', (), {})
>>> c = C()
>>> c
<__main__.C object at 0x0000026EFD5C2DC0>
>>> D = type('D', (C,), dict(x=250))
>>> D.__bases__
(<class '__main__.C'>,)
>>> D.x
250
>>> def funC(self, name="FishC"):
... print(f"Hello {name}")
...
>>> E = type('E', (), dict(say_hi=funC))
>>> e = E()
>>> e.say_hi()
Hello FishC
>>> e.say_hi("小甲鱼")
Hello 小甲鱼
还是没能理解,怎么判断字符串是不是键值对。。 本帖最后由 阿奇_o 于 2022-11-30 20:02 编辑
你是在做那个"选做题"吧~? 如果是,那么具体场景应该是 处理request的字符串数据,
这包括GET的params的query-string形式,和POST的data字符串形式(其实也是类似query-string的形式)等
所以,我举个例子吧,大概应该是这样(你改成pytest的测试用例那样的test_xxx,该改的则改,"能跑就行" ^_ ):
class Request:
def __init__(self, method='GET', url='/'):
self._method = method
self._url = url
self._params = None
@property
def method(self):
return self._method.lower()
@method.setter
def method(self, value):
self._method = value
@property
def url(self):
return self._url.lstrip('/')
@url.setter
def url(self, url):
self._url = url
@property
def params(self):
return self._params if self._params else None
@params.setter
def params(self, params=None):
if params is None:
self._params = dict()
else:
if isinstance(params, dict):
self._params = params
elif isinstance(params, str):
'''like the Query-String: /search?id=1001&name=Alice '''
kv = params.split('&')
self._params = {i.split('=') : i.split('=') for i in kv}
req = Request()
print('url: ', req.url)
print('Method: ', req.method)
print('params: ', req.params)
req.url = '/search?id=1001&name=Alice' # query-string
print('url: ', req.url)
print('Method: ', req.method)
print('params: ', req.params)
# req.data = '/register?name=Alice&password=123456' # POST的 是val.keys()和val.values()意思么 cflying 发表于 2022-12-1 19:01
是val.keys()和val.values()意思么
不是哦 啥意思哦?比如判断 "'x': 1, 'y': 2" 是不是键值对的形式?能给个例子吗? class Request:
def init(self):
self.data = None
@property
def data(self):
return self.data
@data.setter
def data(self, value):
if isinstance(value, dict):
self.data = value
elif isinstance(value, str):
try:
self.data = dict(item.split(":") for item in value.split(","))
except ValueError:
self.data = value hrpzcf 发表于 2022-12-8 18:03
啥意思哦?比如判断 "'x': 1, 'y': 2" 是不是键值对的形式?能给个例子吗?
应该是包含“:”和“,”的都是键值对吧? 搞这么麻烦干啥,直接用eval函数执行字符串语句,如果是字典格式的,type()就是dict,用个if判断搞一下
a="{'1':,'2':}"
type(a)
<class 'str'>
b=eval(a)
type(b)
<class 'dict'> Mefine 发表于 2022-11-30 16:13
比如下面这种程序,我还需要判断传入参数如果是字符串,那么是不是键值对,如何去判断
我理解的是你要传入的val参数必须是 字符串(str) 或者 字典(dict) 类型吧
@data.setter
def data(self, va1):
if type(val) != dict and type(val) != str :
return '值必须是字典或字符串'
self.__data = val
页:
[1]