首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R6初始化中调用R6类的函数

在R6初始化中调用R6类的函数
EN

Stack Overflow用户
提问于 2021-03-10 10:47:55
回答 1查看 269关注 0票数 2

我正试图为其他数据科学家和数据分析人员构建我们的数据库连接样板编码的内部工具的参考实现。

我们的软件开发人员在python中做了类似的事情:

代码语言:javascript
复制
class DataRepository:

    def __init__(self):
        if user is not None and account is not None and password is not None and warehouse is not None and role is not None and database is not None and schema is not None:
            self.ctx = snowflake.connector.connect(
                user=user,
                password=password,
                account=account,
                role=role,
                database=database,
                schema=schema,
                warehouse=warehouse,
                login_timeout=login_timeout,
                ocsp_fail_open=ocsp_fail_open
            )
        else:
            secret_str = self.get_secrets()

            self.ctx = snowflake.connector.connect(
                user=secret_str['user'],
                password=secret_str['password'],
                account=secret_str['account'],
                role=secret_str['role'],
                database=secret_str['database'],
                schema=secret_str['schema'],
                warehouse=secret_str['warehouse'],
                login_timeout=login_timeout,
                ocsp_fail_open=ocsp_fail_open
            )

    def get_secrets(self):
        my_session = boto3.session.Session(region_name=AWS_DEFAULT_REGION)
        client = my_session.client(
            service_name='secretsmanager',
            region_name=AWS_DEFAULT_REGION,
        )
        get_secret_value_response = client.get_secret_value(
            SecretId=SECRET_NAME
        )
        secret_str = json.loads(get_secret_value_response['SecretString'])
        return secret_str

我试图用S3将其复制为:

代码语言:javascript
复制
DataRepository <-
  R6Class(
    classname = "DataRepository",
    public = list(
      ctx = NULL,
      secrets = NULL,
      initialize = function() {
        if (length(user) == 1 &
            length(account) == 1 & length(password) == 1
            &
            length(warehouse) == 1 &
            length(role) == 1 & length(database) == 1) {
          self$ctx <- dbConnect(
            odbc::odbc(),
            Driver = "SnowflakeDSIIDriver",
            Database = database,
            Uid = user,
            Pwd = password,
            Server = paste0(account, ".snowflakecomputing.com"),
            role = role
          )
        } else {
          secret_dict <- self$getSecrets()
          self$ctx <- dbConnect(
            odbc::odbc(),
            Driver = secret_dict$user,
            Database = secret_dict$database,
            Uid = secret_dict$user,
            Pwd = secret_dict$password,
            Server = paste0(secret_dict$account, ".snowflakecomputing.com"),
            role = secret_dict$account
          )
        }
      },
      getSecrets = function() {
        secrets_client <- paws::secretsmanager(config =
                                                 list(region = AWS_REGION))
        get_secret_value_response <- secrets_client$get_secret_value(SecretId = SECRETS_NAME)
        secrets_str <-
          get_secret_value_response$SecretString %>% fromJSON()
        return(secrets_str)
      }
    )
    
  )

但是,我似乎无法像我同事在python中那样访问初始化器中的get_secrets函数。

有什么简单的解决办法吗?

PS:我对R6系统不太熟悉,我相信我的困惑可能是由于概念上的错误,但我很乐意了解更多:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-20 20:41:48

您的代码在getSecrets方面很好,但是您忘记了定义构造函数参数。

考虑到这一点:

代码语言:javascript
复制
DataRepository <-
  R6Class(
    classname = "DataRepository",
    public = list(
      ctx = NULL,
      secrets = NULL,
      initialize = function(user, account,password,warehouse,role,database) {
        if ( !missing(database) &&
            length(user) == 1 &&
            length(account) == 1 && length(password) == 1 &&
            length(warehouse) == 1 &&
            length(role) == 1 && length(database) == 1) {
          self$ctx <- dbConnect(
            odbc::odbc(),
            Driver = "SnowflakeDSIIDriver",
            Database = database,
            Uid = user,
            Pwd = password,
            Server = paste0(account, ".snowflakecomputing.com"),
            role = role
          )
        } else {
          secret_dict <- self$getSecrets()
          ## self$ctx <- dbConnect(
          ##   odbc::odbc(),
          ##   Driver = secret_dict$user,
          ##   Database = secret_dict$database,
          ##   Uid = secret_dict$user,
          ##   Pwd = secret_dict$password,
          ##   Server = paste0(secret_dict$account, ".snowflakecomputing.com"),
          ##   role = secret_dict$account
          ## )
        }
      },
      getSecrets = function() {
        cat( "I am in the getSecrets method!\n")
        ## secrets_client <- paws::secretsmanager(config =
        ##                                          list(region = AWS_REGION))
        ## get_secret_value_response <- secrets_client$get_secret_value(SecretId = SECRETS_NAME)
        ## secrets_str <-
        ##   get_secret_value_response$SecretString %>% fromJSON()
        ## return(secrets_str)
      }
    )
  )

dr = DataRepository$new()

输出:

代码语言:javascript
复制
> dr = DataRepository$new()
I am in the getSecrets method!

检查您的参数是否丢失(上面我只检查了最后一个参数,如果您只执行位置参数,这是没有保证的),或者设置您有意义地处理的默认值,或者只编写一个函数,检查输入参数并返回FALSE,如果这些参数不够,您应该去获取它们的秘密。

也要使用双安培,例如。&&而不是&,后者是一个矢量化的运算符。您在这里应该只有一个值,如果wisn不是这样的话,您将欢迎发出警告。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66563146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档