def dae_mq_get_consumer(self, data_type: str, num: int): vin = self.get_robot_variable("GLOBAL", "VIN") env = self.get_robot_variable("GLOBAL", "项目名称") config = MQ_CONFIG[env] assert data_type in config['topics'], KeyError(f"validation of {data_type} is not supported!") if data_type in self.consumers: return self.consumers[data_type] else: consumer = DAEKafkaConsumer( vin=vin, servers=config.get('servers', None), cluster=config.get('cluster', str()), project=config.get('project', str()), ) consumer.subscribe(topic=config['topics'][data_type], num=num) self.consumers[data_type] = consumer # consumer.seek_to_offset(topic=config['topics'][data_type]) # consumer.seek_to('begin') return consumer
时间: 2024-03-04 20:51:01 浏览: 38
这段代码是关于获取 Kafka 消费者的,接受三个参数,分别是数据类型、数量和一些配置信息。其中,数据类型必须是配置信息中的合法 topic,否则会抛出异常。如果已经存在该数据类型的消费者,则直接返回该消费者实例;否则,新建一个 DAEKafkaConsumer 类的实例,并订阅对应的 topic,最后将这个实例保存在 consumers 字典中,并返回该实例。
相关问题
优化代码: import logging class DAELogControl(): def __init__(self, path): self.path = path self.logger = logging.getLogger(__name__) self.consoleFormatter = logging.Formatter("[%(asctime)s] %(levelname)s (%(filename)s:%(lineno)d): %(message)30s...") # self.consoleFormatter = logging.Formatter("%(levelname)s [%(asctime)s] (%(filename)s:%(lineno)d): %(message)30s...") self.fileFormatter = logging.Formatter("[%(asctime)s] %(levelname)s (%(filename)s:%(lineno)d): %(message)s") # self.fileFormatter = logging.Formatter("%(levelname)s [%(asctime)s] (%(filename)s:%(lineno)d): %(message)s") self.logger.propagate = False self.logger.setLevel(logging.DEBUG) self.consoleHandler = logging.StreamHandler() self.consoleHandler.setFormatter(self.consoleFormatter) self.consoleHandler.setLevel(logging.INFO) self.logger.addHandler(self.consoleHandler) self.fileHandler = logging.FileHandler(self.path) self.fileHandler.setFormatter(self.fileFormatter) self.fileHandler.setLevel(logging.DEBUG) self.logger.addHandler(self.fileHandler) def dae_data_err(self, msg): self.logger.debug(msg, stacklevel=2) def dae_info(self, msg): self.logger.info(msg, stacklevel=2) def dae_error(self, msg): self.logger.error(msg, stacklevel=2)
可以通过以下几个方面来优化代码:
1. 代码格式化:对代码进行格式化,使其更具可读性,例如在类定义的左括号前添加空格,代码缩进等。
2. 使用默认参数:将默认参数添加到函数参数中,以避免重复代码。例如,将默认的日志格式添加到日志处理程序中。
3. 删除重复代码:删除重复代码,例如在日志处理程序中使用了相同的格式化器。
4. 使用更具描述性的命名:使用更具描述性的变量和函数名称可以使代码更易于理解和维护。
下面是优化后的代码:
```python
import logging
class DAELogControl:
def __init__(self, path):
self.path = path
self.logger = logging.getLogger(__name__)
self.logger.propagate = False
self.logger.setLevel(logging.DEBUG)
self.consoleHandler = logging.StreamHandler()
self.consoleHandler.setLevel(logging.INFO)
self.consoleHandler.setFormatter(logging.Formatter("[%(asctime)s] %(levelname)s (%(filename)s:%(lineno)d): %(message)30s..."))
self.logger.addHandler(self.consoleHandler)
self.fileHandler = logging.FileHandler(self.path)
self.fileHandler.setLevel(logging.DEBUG)
self.fileHandler.setFormatter(logging.Formatter("[%(asctime)s] %(levelname)s (%(filename)s:%(lineno)d): %(message)s"))
self.logger.addHandler(self.fileHandler)
def dae_data_err(self, msg):
self.logger.debug(msg, stacklevel=2)
def dae_info(self, msg):
self.logger.info(msg, stacklevel=2)
def dae_error(self, msg):
self.logger.error(msg, stacklevel=2)
```
通过这些优化,代码变得更加简洁和易于理解。
def register_robot_var(scope: str, *var_names): def wrapper(func): assert not hasattr(func, "robot_name"), RuntimeError( "装饰器<register_robot_var>应在robot装饰器<keyword>的下面使用,因为需要获取关键字的名称" ) if not hasattr(func, "internal_robot_var_info"): func.internal_robot_var_info = set() func.internal_robot_var_info.add(get_dae_variable_name(scope, *var_names)) return func return wrapper
这是一个 Python 装饰器函数,名为 `register_robot_var`,其作用是将一个变量名注册到被装饰函数的 `internal_robot_var_info` 集合中。
该装饰器函数接受两个参数:`scope` 和 `*var_names`。`scope` 表示变量名所在的作用域,`*var_names` 表示一个可变数量的位置参数,用于传递变量名。该函数返回一个内部函数 `wrapper`,该函数接受一个参数 `func`,即被装饰的函数。
在 `wrapper` 内部,首先使用 `assert` 语句检查被装饰函数 `func` 是否已经被 `robot` 装饰器装饰过,从而获取到关键字的名称。如果没有被装饰过,则抛出一个 `RuntimeError` 异常。
接着,如果被装饰函数 `func` 没有 `internal_robot_var_info` 属性,则创建一个空集合并将其赋值给该属性。然后,将通过 `get_dae_variable_name` 函数获取到的变量名添加到集合中。
最后,返回被装饰函数 `func`。
阅读全文