#Idiomas

0 Seguidores · 9 Postagens

Uma linguagem de programação é uma linguagem formal que especifica um conjunto de instruções que pode ser usados para produzir vários tipos de saída. As linguagens de programação geralmente consistem em instruções para um computador. As linguagens de programação podem ser usadas para criar programas que implementam algoritmos específicos.

É uma tag geral que cobre os tópicos relacionados à programação com a Plataforma de Dados InterSystems usando diferentes linguagens.

Artigo Heloisa Paiva · Set. 16, 2025 3m read

Começar a usar ObjectScript é realmente empolgante, mas também pode parecer um pouco estranho se você está acostumado com outras linguagens. Muitos iniciantes tropeçam nos mesmos obstáculos, então aqui estão alguns "pegadinhas" que você vai querer evitar. (Além de algumas dicas amigáveis para contorná-las.)

Nomear Coisas Aleatoriamente

Todos nós já fomos culpados de nomear algo como Test1 ou MyClass apenas para seguir em frente rapidamente. Mas quando seu projeto cresce, esses nomes se tornam um pesadelo.

0
0 35
InterSystems Oficial Danusa Calixto · Fev. 17, 2025

Primeiro, deixe-me desejar um Feliz Ano Novo à comunidade de desenvolvedores! Esperamos trazer muitas coisas boas para vocês este ano, e hoje eu gostaria de apresentar a versão mais recente da extensão Intersystems Language Server para o VS Code. A maioria das melhorias do Language Server são experimentadas por meio da interface do usuário da extensão ObjectScript, então você pode não estar ciente das muitas melhorias em áreas como Intellisense e hover overs que foram lançadas ao longo de 2024. Dê uma rápida lida no CHANGELOG do Language Server e descubra o que você perdeu. Mais recentemente,

0
0 37
Artigo Heloisa Paiva · Dez. 5, 2024 3m read

Se vocês gostam de Java e têm um ecossistema Java ativo no trabalho e precisam incorporar IRIS, isso não é um problema. A Gateway de Linguagem Externa de Java fará isso sem complicações, ou quase. Essa gateway serve como ponte entre Java e ObjectScript no IRIS. Vocês podem criar objetos de classes Java no IRIS e chamar seus métodos. Só precisam de um arquivo JAR para fazer isso.

Connection diagram: proxy object <-> Gateway object <-> TCP/IP <-> External server <-> target object

0
0 67
Artigo Heloisa Paiva · Maio 20, 2024 21m read

Há 2 anos eu venho utilizando Python embutido diariamente. Talvez seja o momento de compartilhar um feedback sobre essa jornada.

Por que escrever esse feedback? Porque eu acredito que sou como a maioria das pessoas aqui, um desenvolvedor ObjectScript, e penso que a comunidade poderia ter algum benefício desse feedback e entender melhor os prós e contras de escolher Python embutido para desenvolver em IRIS. Além de evitar algumas armadilhas.

image

Introdução

Eu sou desenvolvedor desde 2010 e trabalho com ObjectScript desde 2013.

Então são aproximadamente 10 anos de experiência com ObjectScript.

Desde 2021 e o lançamento do Python Embutido no IRIS, eu me propus um desafio:

  • Aprender Python
  • Fazer tudo o máximo possível com Python

Quando eu comecei essa jornada, eu não tinha ideia do que era Python. Então, comecei com o básico e ainda estou aprendendo todo dia.

Começando com Python

O lado bom do Python é que é fácil de aprender. É ainda mais fácil se você já conhece ObjectScript.

Por quê? Elas têm muito em comum.

ObjectScriptPython
Não tipadaNão tipada
Scripting languageScripting language
Orientada a ObjetoOrientada a Objeto
InterpretadaInterpretada
Fácil integração com CFácil integração com C

Então, se você conhece ObjectScript você já sabe muito sobre Python.

Porém, há algumas diferenças, dentre as quais algumas não são fáceis de entender.

Python não é ObjectScript

Para manter as coisas simples, vou focar nas principais diferenças entre ObjectScript e Python.

Para mim, há 3 principais diferenças:

  • Pep8
  • Módulos
  • Dunders

Pep8

O que é Pep8 ?

É um conjunto de regras para escrever códigos Python.

pep8.org

Algumas delas são:

  • Convenção de nomenclatura
  • nomes de variáveis
    • snake_case
  • nomes de classes
    • CamelCase
  • indentação
  • comprimento da linha
  • etc.

Por que isso é importante?

Porque é a maneira de escrever código Python. Se você não seguir essas regras, terá dificuldade em ler o código de outras pessoas e elas terão dificuldade de ler o seu.

Como desenvolvedores ObjectScript, também temos algumas regras para seguir, mas não são tão rígidas como a Pep8.

Eu aprendi Pep8 da maneira mais difícil.

Para contar a história, eu sou engenheiro de vendas na InterSystems e estou fazendo várias demos. Certo dia, eu estava fazendo uma demo de Python Embutido para um cliente que era desenvolvedor Python, e a conversa encurtou quando ele viu meu código. Ele me contou que meu código não era nada "Pythonico" (ele estava certo). Eu estava programando em Python como eu programava em ObjectScript. Por causa disso, ele disse que não estava interessado no Python Embutido mais. Eu fiquei chocado e decidi aprender Python do jeito certo.

Assim, se você quer aprender Python, aprenda Pep8 primeiro.

Módulos

Os módulos são uma funcionalidade que não temos em ObjectScript.

Geralmente, em linguagens orientadas a objetos, há classes e pacotes. No Python, temos classes, pacotes e módulos.

O que é um módulo?

É um arquivo com extensão .py. É a maneira de organizar seu código.

Você não entendeu? No começo eu também não. Portanto vamos usar um exemplo.

Geralmente, quando você quer criar uma classe em ObjectScript, você cria um arquivo .cls e coloca sua classe ali dentro. E, se quiser criar outra classe, usa outro arquivo .cls. Por fim, se quiser criar um pacote, você gera uma pasta e coloca os arquivos .cls dentro dela.

Em Python fazemos o mesmo, mas ele tem a habilidade de guardar várias classes num mesmo arquivo. Esse arquivo é chamado módulo. É importante saber que é "Pythônico" ter muitas classes em um mesmo arquivo.

Portanto, planeje de antemão como pretende organizar seu código e como vai nomear seus módulos para não terminar como eu, com um monte de módulos com o mesmo nome das suas classes.

Um mau exemplo:

A bad example :

MinhaClasse.py

class MinhaClasse:
    def __init__(self):
        pass

    def meu_metodo(self):
        pass

Para instanciar essa classe, você fará:

import MinhaClasse.MinhaClasse # estranho, né?

minha_classe= MinhaClasse()

Estranho, né?

Dunders

Dunders são métodos especiais em Python. Eles são chamados de dunder porque começam e terminam com dois caracteres underscores (_).

Eles são similares aos métodos do ObjectScript com '%'.

Eles são usados para:

  • construtor
  • sobrecarga de operador
  • representação do objeto
  • etc.

Exemplo:

class MinhaClasse:
    def __init__(self):
        pass

    def __repr__(self):
        return "MyClass"

    def __add__(self, other):
        return self + other

Aqui temos 3 métodos dunder:

  • __init__ : construtor
  • __repr__ : representação do objeto
  • __add__ : sobrecarga de operador

Métodos Dunders estão por toda parte em Python. São uma grande parte da linguagem, mas não se preocupe; você vai aprendê-los rapidamente,

Conclusão

Python não é ObjectScript, e você terá que aprender. Mas não é tão difícil, então você vai aprender rápido. Apenas mantenha em mente que você deverá aprender Pep8 e como organizar seu código com módulos e métodos dunder.

Bons sites para aprender Python


Python Embutido

Agora que você conhece um pouco mais sobre o Python, vamos falar de Python Embutido.

O que é o Python Embutido?

Python Embutido é uma maneira de executar código Python dentro do IRIS. É uma nova funcionalidade do IRIS 2021.2+. Isso significa que seu código Python será executado no mesmo processo que o IRIS.

No mais, toda classe ObjectScript é uma classe Python, e o mesmo cale para métodos e atributos, e vice-versa. 🥳 Isso é bacana!

Como usar Python Embutido?

Há 3 maneiras diferentes de usar Python Embutido:

  • Usando a tag de linguagem do ObjectScript
    • Method Foo() As %String [ Language = python ]
  • Usando a função ##class(%SYS.Python).Import()
  • Usando o interpretador de Python
    • python3 -c "import iris; print(iris.system.Version.GetVersion())"

Mas se você quiser usar mesmo o Python Embutido, você terá que evitar usar a tag de linguagem.

image

Por quê?

  • Porque não é Pythônico
  • Porque também não é ObjectScript
  • Porque você não terá um debugador
  • Porque você não terá um linter
  • Porque você não terá um formatador
  • Porque você não terá um framework de testes
  • Porque você não terá um gerenciador de pacotes
  • Porque você está misturando duas linguagens no mesmo arquivo
  • Porque quando o seu processo quebra, você não tem um rastreio da pilha
  • Porque você não pode usar um ambiente virtual ou ambientes conda
  • ...

Não me entenda mal, isso funciona e pode ser útil se você quiser testar algo rapidamente, mas na minha opinião não é uma boa prática.

Então, o que eu aprendi nesses 2 anos de Python Embutido, e como utilizá-lo da maneira correta?

Como eu uso Python embutido

Para mim, existem duas opções:

  • Usar libraries do Python como se fossem classes do ObjectScript
    • with ##class(%SYS.Python).Import() function
  • Usar uma abordagem de Python em primeiro lugar.

Usar libraries do Python como se fossem classes do ObjectScript

Você ainda quer usar Python no seu código ObjectScript, mas não quer usar a tag de linguagem. O que você pode fazer, então?

"Simplesmente" usar códigos e libraries do Python como se fossem classes ObjectScript.

Vamos tomar como exemplo:

Você quer usar a library requests (é uma library para fazer requisições HTTP) no seu código ObjectScript

Com a tag de linguagem

ClassMethod Get() As %Status [ Language = python ]
{
	import requests

	url = "https://httpbin.org/get"
	# faça uma requisição get
	response = requests.get(url)
	# pegue os dados do json de resposta
	data = response.json()
	# iterar pelos dados e printar os pares chave-valoe
	for key, value in data.items():
		print(key, ":", value)
}

Por que eu não acho uma boa ideia?

Porque você está misturando duas linguagens no mesmo arquivo, e você não tem um debugador, um linter, um formatador, etc. Se esse código der algum problema, você terá dificuldade de debugar. Se você não tem um rastreio da pilha, não saberá da onde veio o erro. E também não tem a funcionalidade de completar automaticamente.

Sem a tag de linguagem

ClassMethod Get() As %Status
{
	set status = $$$OK
    set url = "https://httpbin.org/get"
    // Importar o módulo Python "requests" como uma classe ObjectScript 
    set request = ##class(%SYS.Python).Import("requests")
    // Chamar o método get da classe request
    set response = request.get(url)
    // Chamar o método json da classe response
	set data = response.json()
    // Aqui os dados são um dicionário Python
    // Para iterar por um dicionário Python, você deve usar o método dunder e items().
	// Importar um módulo pré-existente de Python.
	set builtins = ##class(%SYS.Python).Import("builtins")
    // Aqui estamos usando "len" do módulo de pré-existentes (built in) para saber o comprimento do dicionário.
    For i = 0:1:builtins.len(data)-1 {
        // Agora nós convertemos os itens do dicionário para uma lista, então pegamos a chave e o valor usando o método dunder __getitem__
		Write builtins.list(data.items())."__getitem__"(i)."__getitem__"(0),": ",builtins.list(data.items())."__getitem__"(i)."__getitem__"(1),!
	}
	quit status
}

Por que eu acho isso uma boa ideia?

Porque você está utilizando Python como se fosse ObejctScript. Você está importando a library requests como uma classe ObjectScript e usando como se fosse uma classe ObjectScript. Toda a lógica está em ObjectScript, e você utiliza o Python como uma library. Até para manutenção, é mais fácil de ler e entender; qualquer desenvolvedor ObjectScript consegue entender esse código. A desvantagem é que você tem que saber como usar os métodos dunders, e como usar Python como se fosse ObjectScript.

Conclusão

Acredite em mim, dessa maneira você vai acabar com um código mais robusto e conseguirá debugar facilmente. A princípio parece difícil, mas você vai entender os benefícios de aprender Python mais rápido do que você pensa.

Usar uma abordagem de Python em primeiro lugar

Essa é a maneira que eu prefiro usar Python Embutido

Eu construí várias ferramentas usando essa abordagem e estou muito feliz com isso.

Alguns exemplos:

Então, o que é uma abordagem de Python em primeiro lugar?

Existe apenas uma regra: o código Python deve estar em arquivos . py, o código ObjectScript deve estar em arquivos .cls

Como conseguir isso?

A ideia é criar classes de invólucro de ObjectScript para chamar o código Python.


Vamos tomar o exemplo de iris-fhir-python-strategy :

Exemplo : iris-fhir-python-strategy

Primeiramente, nós temos que entender como o servidor IRIS FHIR funciona.

Todo servidor IRIS FHIR implementa uma Strategy (estratégia).

Uma Strategy é um conjunto de duas classes:

SuperclasesParâmetros de Subclasse
HS.FHIRServer.API.InteractionsStrategyStrategyKey — Especifica um identificador único para a InteractionsStrategy.
InteractionsClass — Especifica o nome da sua subclasse de Interactions (interações).
HS.FHIRServer.API.RepoManagerStrategyClass —Especifica o nome da sua sublcasse InteractionsStrategy.
StrategyKey — Especifica um identificaod único para a InteractionsStrategy. Deve ter o mesmo valor do parâmetro StrategyKey na subclasse InteractionsStrategy.

As duas classes são do tipo Abstract (abstratas).

  • HS.FHIRServer.API.InteractionsStrategy é uma classe Abstractque deve ser implementada para customizar o comportamento do Servidor FHIR.
  • HS.FHIRServer.API.RepoManager é uma classe Abstract que deve ser implementada para customizar o armazenamento do servidor FHIR.

Observações

Para o nosso exemplo, vamos focar apenas na classe HS.FHIRServer.API.InteractionsStrategy, mesmo que a classe HS.FHIRServer.API.RepoManager também seja implementada e obrigatória para customizar o Servidor FHIR. A classe HS.FHIRServer.API.RepoManager é implementada pela classe HS.FHIRServer.Storage.Json.RepoManager, que é a implementação padrão do Servidor FHIR.

##Onde achar o código

Todo o código fonte pode ser achado nesse repositório: iris-fhir-python-strategy A pasta src contém as seguintes pastas:

  • python : contém o código Python
  • cls : contem o código ObjectScript que é usado para chamar o código Python

Como implementar uma Strategy

Nesta prova de conceito, só estaremos interessados em como implementar uma Strategy em Python, não em como implementar um RepoManager (gerenciador de repositório).

Para implementar uma Strategy você deve criar pelo menos duas classes:

  • Uma classe que herda da HS.FHIRServer.API.InteractionsStrategy
  • Uma classe que herda da HS.FHIRServer.API.Interactions class

Implementação de InteractionsStrategy

A classe HS.FHIRServer.API.InteractionsStrategy foca em customizar o comportamento do Servidor FHIR ao sobrescrever os seguintes métodos:

  • GetMetadataResource: chamado para pegar os metadados do servidor FHIR
    • esse é o único método que vamos sobrescrever nessa prova de conceito

HS.FHIRServer.API.InteractionsStrategy também tem dois parâmetros:

  • StrategyKey : um identificador único para a InteractionsStrategy
  • InteractionsClass : o nome da subclasse de Interactions

Implementação de Interactions

A classe HS.FHIRServer.API.Interactions foca em customizar o comportamento do Servidor FHIR ao sobrescrever os seguintes métodos:

  • OnBeforeRequest : chamada antes da requisição ser enviada ao servidor
  • OnAfterRequest : chamada após a requisição ser enviada ao servidor
  • PostProcessRead : chamada após a operação de leitura estar finalizada
  • PostProcessSearch : chamada após a operação de procura estar finalizada
  • Read : chamada para ler um recurso
  • Add : chamada para adicionar um recurso
  • Update : chamada para atualizar um recurso
  • Delete : chamada para deletar um recurso
  • e muito mais...

Nós implementamos a classe HS.FHIRServer.API.Interactions no arquivo src/cls/FHIR/Python/Interactions.cls.

 
Spoiler
Class FHIR.Python.Interactions Extends (HS.FHIRServer.Storage.Json.Interactions, FHIR.Python.Helper)
{

Parameter OAuth2TokenHandlerClass As%String = "FHIR.Python.OAuth2Token";

Method %OnNew(pStrategy As HS.FHIRServer.Storage.Json.InteractionsStrategy) As%Status { // %OnNew é chamado quando o objeto é criado.// O parâmetro pStrategy é o objeto de estratégia criado nesse objeto.// A implementação padrão não faz nada// Primeiro define o caminho do Python de uma variável de ambienteset..PythonPath = $system.Util.GetEnviron("INTERACTION_PATH") // Depois define o nome da classe de Python pela variável de ambienteset..PythonClassname = $system.Util.GetEnviron("INTERACTION_CLASS") // Então define o nome do módulo Python pela variável de ambienteset..PythonModule = $system.Util.GetEnviron("INTERACTION_MODULE")

<span class="hljs-keyword">if</span> (<span class="hljs-built_in">..PythonPath</span> = <span class="hljs-string">""</span>) || (<span class="hljs-built_in">..PythonClassname</span> = <span class="hljs-string">""</span>) || (<span class="hljs-built_in">..PythonModule</span> = <span class="hljs-string">""</span>) {
	<span class="hljs-comment">//quit ##super(pStrategy)</span>
	<span class="hljs-keyword">set</span> <span class="hljs-built_in">..PythonPath</span> = <span class="hljs-string">"/irisdev/app/src/python/"</span>
	<span class="hljs-keyword">set</span> <span class="hljs-built_in">..PythonClassname</span> = <span class="hljs-string">"CustomInteraction"</span>
	<span class="hljs-keyword">set</span> <span class="hljs-built_in">..PythonModule</span> = <span class="hljs-string">"custom"</span>
}


<span class="hljs-comment">// Então, define a classe Python</span>
<span class="hljs-keyword">do</span> <span class="hljs-built_in">..SetPythonPath</span>(<span class="hljs-built_in">..PythonPath</span>)
<span class="hljs-keyword">set</span> <span class="hljs-built_in">..PythonClass</span> = <span class="hljs-keyword">##class</span>(FHIR.Python.Interactions).GetPythonInstance(<span class="hljs-built_in">..PythonModule</span>, <span class="hljs-built_in">..PythonClassname</span>)

<span class="hljs-keyword">quit</span> <span class="hljs-keyword">##super</span>(pStrategy)

}

Method OnBeforeRequest( pFHIRService As HS.FHIRServer.API.Service, pFHIRRequest As HS.FHIRServer.API.Data.Request, pTimeout As%Integer) { // OnBeforeRequest é chamado antes de cada requisição ser processada.if$ISOBJECT(..PythonClass) { set body = ##class(%SYS.Python).None() if pFHIRRequest.Json '= "" { set jsonLib = ##class(%SYS.Python).Import("json") set body = jsonLib.loads(pFHIRRequest.Json.%ToJSON()) } do..PythonClass."on_before_request"(pFHIRService, pFHIRRequest, body, pTimeout) } }

Method OnAfterRequest( pFHIRService As HS.FHIRServer.API.Service, pFHIRRequest As HS.FHIRServer.API.Data.Request, pFHIRResponse As HS.FHIRServer.API.Data.Response) { // OnAfterRequest é chamado depois de cada requisição ser processada.if$ISOBJECT(..PythonClass) { set body = ##class(%SYS.Python).None() if pFHIRResponse.Json '= "" { set jsonLib = ##class(%SYS.Python).Import("json") set body = jsonLib.loads(pFHIRResponse.Json.%ToJSON()) } do..PythonClass."on_after_request"(pFHIRService, pFHIRRequest, pFHIRResponse, body) } }

Method PostProcessRead(pResourceObject As%DynamicObject) As%Boolean { // PostProcessRead é chamada após um recurso ser lido na base de dados.// Retorna 1 para indicar que o recurso deve ser incluído na resposta.// Retorna 0 para indicar que o recurso deve ser excluído da resposta.if$ISOBJECT(..PythonClass) { if pResourceObject '= "" { set jsonLib = ##class(%SYS.Python).Import("json") set body = jsonLib.loads(pResourceObject.%ToJSON()) } return..PythonClass."post_process_read"(body) } quit1 }

Method PostProcessSearch( pRS As HS.FHIRServer.Util.SearchResult, pResourceType As%String) As%Status { // PostProcessSearch é chamado depois de uma busca.// Retorna $$$OK para indicar que a busca teve sucesso.// Retorna um código de erro para indicar que a busca falhou.if$ISOBJECT(..PythonClass) { return..PythonClass."post_process_search"(pRS, pResourceType) } quit$$$OK }

Method Read( pResourceType As%String, pResourceId As%String, pVersionId As%String = "") As%DynamicObject { return##super(pResourceType, pResourceId, pVersionId) }

Method Add( pResourceObj As%DynamicObject, pResourceIdToAssign As%String = "", pHttpMethod = "POST") As%String { return##super(pResourceObj, pResourceIdToAssign, pHttpMethod) }

/// Returns VersionId for the "deleted" version Method Delete( pResourceType As%String, pResourceId As%String) As%String { return##super(pResourceType, pResourceId) }

Method Update(pResourceObj As%DynamicObject) As%String { return##super(pResourceObj) }

}

A classeFHIR.Python.Interactions herda das classes HS.FHIRServer.Storage.Json.Interactions e FHIR.Python.Helper.

A classe HS.FHIRServer.Storage.Json.Interactions é o padrão de implementação do Servidor FHIR.

A classe FHIR.Python.Helper foca em ajudar chamar o código Python pelo ObjectScript .

A classe FHIR.Python.Interactions sobrescreve os métodos a seguir:

  • %OnNew : chamado quando o objeto é criado
    • nós usamos esse método para definir o caminho, nome da classe de, e nome de módulo do Python a partir das variáveis de ambiente.
    • se as variáveis de ambiente não forem definidas, utilizamos valores padrão.
    • também definimos a classe python
    • chamamos o método %OnNew da classe pai.
Method %OnNew(pStrategy As HS.FHIRServer.Storage.Json.InteractionsStrategy) As %Status
{
	// Primeiro, definimos o caminho Python por uma variável de ambiente
	set ..PythonPath = $system.Util.GetEnviron("INTERACTION_PATH")
	// Então, definimos o nome da classe Python pela variável de ambiente
	set ..PythonClassname = $system.Util.GetEnviron("INTERACTION_CLASS")
	// Depois, definimos o nome do módulo Python da variável de ambiente
	set ..PythonModule = $system.Util.GetEnviron("INTERACTION_MODULE")

	if (..PythonPath = "") || (..PythonClassname = "") || (..PythonModule = "") {
		// usa valores padrão
		set ..PythonPath = "/irisdev/app/src/python/"
		set ..PythonClassname = "CustomInteraction"
		set ..PythonModule = "custom"
	}

	// A seguir, definimos a classe Python
	do ..SetPythonPath(..PythonPath)
	set ..PythonClass = ..GetPythonInstance(..PythonModule, ..PythonClassname)

	quit ##super(pStrategy)
}
  • OnBeforeRequest : chamada antes da requisição ser enviada ao servidor
    • chamamos o método on_before_request da classe Python
    • passamos os objetos HS.FHIRServer.API.Service e HS.FHIRServer.API.Data.Request , o corpo da requisição e o tempo limite de execução.
Method OnBeforeRequest(
	pFHIRService As HS.FHIRServer.API.Service,
	pFHIRRequest As HS.FHIRServer.API.Data.Request,
	pTimeout As %Integer)
{
	// OnBeforeRequest é chamado antes de cada requisição ser processada.
	if $ISOBJECT(..PythonClass) {
		set body = ##class(%SYS.Python).None()
		if pFHIRRequest.Json '= "" {
			set jsonLib = ##class(%SYS.Python).Import("json")
			set body = jsonLib.loads(pFHIRRequest.Json.%ToJSON())
		}
		do ..PythonClass."on_before_request"(pFHIRService, pFHIRRequest, body, pTimeout)
	}
}
  • OnAfterRequest : chamado após a requisição ser enviada ao servidor
    • chamamos o método on_after_request da classe Python
    • passamos os objetos HS.FHIRServer.API.Service, HS.FHIRServer.API.Data.Request e HS.FHIRServer.API.Data.Response e o corpo da resposta
Method OnAfterRequest(
	pFHIRService As HS.FHIRServer.API.Service,
	pFHIRRequest As HS.FHIRServer.API.Data.Request,
	pFHIRResponse As HS.FHIRServer.API.Data.Response)
{
	// OnAfterRequest é chamado após cada requisição ser processada
	if $ISOBJECT(..PythonClass) {
		set body = ##class(%SYS.Python).None()
		if pFHIRResponse.Json '= "" {
			set jsonLib = ##class(%SYS.Python).Import("json")
			set body = jsonLib.loads(pFHIRResponse.Json.%ToJSON())
		}
		do ..PythonClass."on_after_request"(pFHIRService, pFHIRRequest, pFHIRResponse, body)
	}
}
  • E por aí em diante...

Interactions em Python

A classe FHIR.Python.Interactions chama os métodos on_before_request, on_after_request, ... da classe Python.

Aqui está uma classe Python abstrata:

import abc
import iris

class Interaction(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def on_before_request(self, 
                          fhir_service:'iris.HS.FHIRServer.API.Service',
                          fhir_request:'iris.HS.FHIRServer.API.Data.Request',
                          body:dict,
                          timeout:int):
        """
        on_before_request é chamada depois que a requisição é enviada ao servidor.
        param fhir_service: o objeto de serviço fhir iris.HS.FHIRServer.API.Service
        param fhir_request: o objeto de requisição fhir iris.FHIRServer.API.Data.Request
        param timeout: o tempo limite de execução em segundos
        return: None
        """
        

    @abc.abstractmethod
    def on_after_request(self,
                         fhir_service:'iris.HS.FHIRServer.API.Service',
                         fhir_request:'iris.HS.FHIRServer.API.Data.Request',
                         fhir_response:'iris.HS.FHIRServer.API.Data.Response',
                         body:dict):
        """
        on_after_request é chamada após a requisição ser enviada ao servidor.
        param fhir_service: o objeto de serviço fhir iris.HS.FHIRServer.API.Service
        param fhir_request: o objeto de requisição fhir iris.FHIRServer.API.Data.Request
        param fhir_response: o objeto de resposta fhir iris.FHIRServer.API.Data.Response
        return: None
        """
        

    @abc.abstractmethod
    def post_process_read(self,
                          fhir_object:dict) -> bool:
        """
        post_process_read é chamado após a operação de leitura finalizar.
        param fhir_object: o objeto fhir
        return: True - o recurso deve ser  retornado ao cliente, False - caso contrário
        """
        

    @abc.abstractmethod
    def post_process_search(self,
                            rs:'iris.HS.FHIRServer.Util.SearchResult',
                            resource_type:str):
        """
        post_process_search é chamada após a operação de pesquisa finalizar.
        param rs: o resultado da pesquisa iris.HS.FHIRServer.Util.SearchResult
        param resource_type: o tipo de recurso
        return: None
        """

Implementação da classe Python abstrata

from FhirInteraction import Interaction

class CustomInteraction(Interaction):

    def on_before_request(self, fhir_service, fhir_request, body, timeout):
        # Extrai o usuário e seus papéis para essa requisição
        # então o consentimento pode avaliado.
        self.requesting_user = fhir_request.Username
        self.requesting_roles = fhir_request.Roles

    def on_after_request(self, fhir_service, fhir_request, fhir_response, body):
        # Limpa o usuário e seus papéis entre as requisições.
        self.requesting_user = ""
        self.requesting_roles = ""

    def post_process_read(self, fhir_object):
        # Avalia consentimento baseado no recurso e usuários/papéis
        # Retornar 0 indica que esse recurso não deveria ser exibido - um erro  "404 Not Found" (não encontrado)
        # Será retornado ao usuário.
        return self.consent(fhir_object['resourceType'],
                        self.requesting_user,
                        self.requesting_roles)

    def post_process_search(self, rs, resource_type):
        # Itera por cada recurso no conjunto de pesquisa e avalia
        # Consentimento baseado no recurso e usuário/papéis
        # Cada linha marcada como deletada e salva será excluída do Bundle (conjunto ad resposta).
        rs._SetIterator(0)
        while rs._Next():
            if not self.consent(rs.ResourceType,
                            self.requesting_user,
                            self.requesting_roles):
                # Marca a linha como deletada e salva.
                rs.MarkAsDeleted()
                rs._SaveRow()

    def consent(self, resource_type, user, roles):
        # Exemplo de lógica de consentimento - só permite que usuários com o papel '%All' vejam
        # Recursos de observações.
        if resource_type == 'Observation':
            if '%All' in roles:
                return True
            else:
                return False
        else:
            return True

Muito longo, faça um resumo

A classe FHIR.Python.Interactions é um invólucro para chamar a classe Python.

As classes abstratas IRSI são implementadas para envolver as classes abstratas Python 🥳.

Isso nos ajuda a manter o código Python e o código ObjectScript separados e então se beneficiar do melhor dos dois mundos.

0
0 93
Artigo Danusa Calixto · Fev. 9, 2024 13m read

Talvez você não perceba isso, mas sua conta de login da InterSystems pode ser usada para acessar uma ampla variedade de serviços da InterSystems que ajudam você a aprender e usar o InterSystems IRIS e outras tecnologias da InterSystems de maneira mais eficaz.  Continue lendo para saber mais sobre como descobrir novos conhecimentos técnicos e ferramentas usando sua conta de login da InterSystems.  Além disso, após a leitura, participe da Enquete na parte inferior, para que possamos ver como este artigo foi útil para você!

O que é uma conta de login da InterSystems? 

Uma conta de login da InterSystems é usada para acessar diversos serviços online que atendem a parceiros e clientes atuais e em potencial.  É um conjunto único de credenciais usadas em mais de 15 aplicativos voltados ao público externo.  Alguns aplicativos (como a WRC ou o iService) exigem uma ativação específica para o acesso ser concedido pela conta.  Provavelmente, há recursos disponíveis que ajudarão você, mas você não os conhece: leia sobre todas as opções e teste uma nova ferramenta para melhorar sua técnica!!

Catálogo de aplicativos

Você pode ver todos os serviços disponíveis para você com sua conta de login da InterSystems ao acessar esse catálogo de aplicativos da InterSystems, localizado em:  https://Login.InterSystems.com.  Isso só listará os aplicativos ou serviços a que você tem acesso no momento.  Ele lembra seus aplicativos usados com mais frequência e os lista na parte superior para sua conveniência. 

Não se esqueça de marcar a página como favorita para acessar facilmente todas essas ferramentas na caixa de ferramentas da sua conta de login da InterSystems!

Detalhes dos aplicativos 

Agora, é hora de entrar nos detalhes de cada aplicativo e ver como eles podem ajudar você como desenvolvedor que trabalha com as tecnologias da InterSystems!  Continue lendo e tente encontrar um novo aplicativo que você possa usar pela primeira vez para melhorar sua eficiência e habilidades como desenvolvedor....

 Getting Started - gettingstarted.intersystems.com 

Público

  • Qualquer pessoa que deseja explorar usando a plataforma de dados da InterSystems IRIS®

Descrição

  • Aprenda a criar aplicativos de missão crítica e uso intensivo de dados rapidamente com o InterSystems IRIS.
  • Siga vídeos e tutoriais que usam SQL, Java, C#/.Net, Node.js, Python ou InterSystems ObjectScript.
  • Use um Sandbox gratuito, baseado na nuvem e dentro do navegador -- IRIS+IDE+Web Terminal— para seguir tutoriais. 

Como isso ajuda a melhorar sua técnica

  • Familiarize-se rapidamente com a tecnologia da InterSystems e a veja em ação com código e exemplos reais!
  • Explore o uso de outras linguagens de programação populares com o InterSystems IRIS.

 Online Learning - learning.intersystems.com

Público

  • Todos os usuários atuais e em potencial dos produtos da InterSystems 

Descrição

  • Materiais autoguiados para ajudar você a desenvolver e dar suporte aos aplicativos mais importantes do mundo:
    • Exercícios práticos
    • Vídeos
    • Cursos online
    • Programas de aprendizado

Como isso ajuda a melhorar sua técnica

  • Aprenda, aprenda, aprenda!! 
  • Nada ajudará você a se tornar um desenvolvedor eficiente mais rápido do que seguir um instrutor técnico habilidoso ensinando novos conceitos para usar nos seus projetos do InterSystems IRIS! 

 Documentação - docs.intersystems.com 

Público

  • Todos os usuários atuais e em potencial dos produtos da InterSystems

Descrição

  • Documentação para todas as versões dos nossos produtos
  • Links, quando necessário, para documentação externa
  • Todo o conteúdo recente é fornecido pelo nosso mecanismo de pesquisa.
  • A página de pesquisa deixa você filtrar por produto, versão e outros aspectos.
  • Algumas documentações exigem autorização (pela conta de login da InterSystems):
    • Documentação da AtScale disponível para clientes da Análise Adaptativa
    • Documentação da HealthShare disponível para usuários da HealthShare
  • Use a nova Lista de Verificação de Impacto de Atualização dinâmica no servidor de documentação!

Como isso ajuda a melhorar sua técnica

  • Use rapidamente materiais de referência de classes e documentação de APIs.
  • Encontre amostras de código. 
  • Leia documentação detalhada sobre o uso de partes do InterSystems IRIS em que você precisa se aprofundar.
  • Solicite mais detalhes ou denuncie problemas diretamente nas páginas de documentação através do recurso "Feedback".

 Evaluation - evaluation.intersystems.com

Público

  • Quem deseja baixar software ou licenças da InterSystems para uso em avaliação ou desenvolvimento

Descrição

  • Downloads do InterSystems IRIS e InterSystems IRIS for Health.
  • Qualquer pessoa pode baixar os kits do Community Edition.
  • Os clientes atuais também podem solicitar uma licença avançada para avaliar os recursos corporativos.
  • As versões de prévia estão disponíveis em pré-lançamento.
  • Os pacotes do Programa de Acesso Antecipado permitem que as pessoas enviem feedback sobre produtos e recursos futuros.

Como isso ajuda a melhorar sua técnica

  • Teste versões de prévia de software para ver como os novos recursos podem ajudar a acelerar seu desenvolvimento.
  • Teste recursos corporativos ao solicitar uma licença de avaliação.
  • Confira se todos os desenvolvedores na sua organização têm a versão mais recente do InterSystems IRIS instalada nas máquinas.
  • Forneça feedback para a Gestão de Produtos da InterSystems sobre os Recursos do Acesso Antecipado para garantir que eles atendam às necessidades da sua equipe após o lançamento completo.

 Developer Community - community.intersystems.com

Público

  • Qualquer pessoa que trabalha com a tecnologia do InterSystems (clientes atuais e em potencial, funcionários e parceiros da InterSystems)

Descrição

  • Monitore comunicados relacionados aos produtos e serviços da InterSystems.
  • Encontre artigos sobre uma variedade de tópicos técnicos.
  • Faça perguntas e receba respostas da comunidade.
  • Explore vagas de trabalho ou desenvolvedores disponíveis para contratação.
  • Participe de competições com prêmios em dinheiro de US$ 1000.
  • Fique por dentro de tudo relacionado a InterSystems!

Como isso ajuda a melhorar sua técnica

  • Com o acesso aos principais especialistas do mundo em tecnologia da InterSystems, você pode aprender com os melhores e continuar interagindo com perguntas, tendências e tópicos em alta.
  • Receba atualizações automaticamente na sua caixa de entrada sobre novos produtos, lançamentos e oportunidades do Programa de Acesso Antecipado.
  • Obtenha ajuda de colegas para tirar suas dúvidas e superar obstáculos.
  • Tenha discussões enriquecedoras com Gerentes e Desenvolvedores de Produtos da InterSystems: aprenda direto da fonte!
  • Eleve suas habilidades a um novo patamar ao compartilhar soluções técnicas e código, além de receber feedback de outros.

 Ideias da InterSystems - ideas.intersystems.com

Público

  • Quem deseja compartilhar ideias para melhorar a tecnologia da InterSystems.

Descrição

  • Publique ideais sobre como melhorar a tecnologia da InterSystems.
  • Leia avaliações existentes e vote ou participe em discussões.
  • A InterSystems levará em conta as ideias mais populares para o desenvolvimento de produtos futuros.

Como isso ajuda a melhorar sua técnica

  • Veja suas ideias e necessidades virarem realidade em produtos da InterSystems ou bibliotecas de código aberto.
  • Familiarize-com ideias de colegas e aprenda a usar os produtos da InterSystems de novas maneiras.
  • Implemente ideias sugeridas por outros, explorando novas partes da tecnologia da InterSystems.

 Global Masters - globalmasters.intersystems.com

Público

  • Quem quer apoiar a tecnologia da InterSystems e ganhar emblemas e brindes

Descrição

  • A plataforma de gamificação criada para que os desenvolvedores aprendam, fiquem por dentro e ganhem reconhecimento pelas contribuições através de conteúdo interativo.
  • Os usuários recebem pontos e emblemas pelo seguinte:
    • Engajamento no Developer Community
    • Engajamento no Open Exchange
    • Publicação de posts nas redes sociais sobre produtos e tecnologias InterSystems
  • Troque pontos por brindes ou treinamento gratuito da InterSystems

Como isso ajuda a melhorar sua técnica

  • Os desafios chamam sua atenção para artigos ou vídeos que talvez não tenha visto no Developer Community, site Learning ou canal do YouTube, sempre aprendendo coisas novas para aplicar aos seus projetos!

 Open Exchange - openexchange.intersystems.com 

Público

  • Desenvolvedores que buscam publicar ou usar ferramentas e pacotes de software reutilizáveis

Descrição

  • Ferramentas e pacotes de desenvolvedores criados com as plataformas de dados e os produtos da InterSystems. 
  • Os pacotes são publicados sob uma variedade de licenças de software (em grande parte, de código aberto).
  • Integração com o GitHub para versionamento de pacotes, discussões e rastreamento de bugs
  • Leia e envie avaliações e encontre os pacotes mais populares.
  • Os desenvolvedores podem enviar issues e fazer melhorias nos pacotes por solicitações pull do GitHub para ajudar a avançar o software da comunidade.
  • Os desenvolvedores podem ver estatísticas de tráfego e downloads de pacotes que publicaram

Como isso ajuda a melhorar sua técnica

  • Não reinvente a roda!  Use pacotes de código aberto criados e mantidos pela InterSystems Community para resolver problemas genéricos, deixando que você foque no desenvolvimento de soluções específicas de que sua empresa precisa.
  • A contribuição com os pacotes de código aberto é uma ótima maneira de receber feedback construtivo no seu trabalho e aprimorar seus padrões de desenvolvimento.
  • Ser um contribuidor respeitado em projetos de código aberto é uma forma excelente de aumentar a demanda pelas suas habilidades e insights. 

 WRC - wrc.intersystems.com

Público

  • Sistema de monitoramento para todos os problemas relatados por clientes no InterSystems IRIS e InterSystems HealthShare.  Os clientes com SUTA podem trabalhar diretamente com o aplicativo.

Descrição

  • Aplicativo Central de Suporte (ou "WRC Direct").
  • sistema de monitoramento para todos os problemas relatados por clientes. 
  • Abra novas solicitações. 
  • Veja todas as ações investigativas e adicione informações e comentários sobre uma solicitação. 
  • Veja informações estatísticas sobre seu histórico de chamadas de suporte. 
  • Encerre solicitações e ofereça feedback sobre o processo de suporte. 
  • Revise arquivos de patches ad-hoc. 
  • Monitore pedidos de alterações de software.
  • Baixe versões de software de produto e cliente atuais.

Como isso ajuda a melhorar sua técnica

  • Os Engenheiros de Suporte da InterSystems podem ajudar você a enfrentar obstáculos técnicos em relação ao desenvolvimento ou gerenciamento de sistemas com os produtos da InterSystems.
  • Relate bugs para garantir que os problemas sejam corrigidos em versões futuras.  

 iService - iservice.intersystems.com

Público

  • Clientes que precisam de suporte sob um contrato SLA

Descrição

  • Uma plataforma de tíquetes de suporte para nossos clientes da saúde, na nuvem e hospedados.
  • Permite cálculos e relatórios de compliance com o acordo de nível de serviço (SLA) orientado por regras.
  • Oferece recursos avançados de exportação e pesquisa de aspectos. 
  • Incorpora um sistema de gestão de Segurança Clínica completo.

Como isso ajuda a melhorar sua técnica

  • Os Engenheiros de Suporte da InterSystems podem ajudar você a enfrentar obstáculos técnicos em relação ao desenvolvimento ou gerenciamento de sistemas com os produtos da InterSystems da saúde ou na nuvem.
  • Relate bugs para garantir que os problemas sejam corrigidos em versões futuras.  

 ICR - containers.intersystems.com

Público

  • Qualquer pessoa que queira usar contêineres da InterSystems

Descrição

  • InterSystems Container Registry
  • Um registro de contêineres acessível programaticamente e IU da Web para navegação.
  • Contêineres do Community Edition disponíveis para todos.
  • Versões comerciais do InterSystems IRIS e InterSystems IRIS for Health disponíveis para clientes atendidos.
  • Gere tokens para usar nos pipelines CICD para buscar contêineres automaticamente.

Como isso ajuda a melhorar sua técnica

  • Aumente a maturidade do seu SDLC ao migrar para pipelines CICD baseados em contêineres para desenvolvimento, testes e implantação!

 Diretório de Parceiros - partner.intersystems.com 

Público

  • Quem quer encontrar um parceiro ou o produto de um parceiro da InterSystems 
  • Parceiros que buscam anunciar software e serviços  

Descrição

  • Pesquise todos os tipos de parceiros da InterSystems:
    • Parceiros de implementação
    • Parceiros de soluções
    • Parceiros de tecnologia
    • Parceiros da nuvem
  • Os parceiros existentes podem gerenciar seus anúncios de serviços e software. 

Como isso ajuda a melhorar sua técnica

  • Contrate especialistas certificados para aprender com eles nos seus projetos.
  • Licencie soluções corporativas baseadas na tecnologia da InterSystems para não precisar desenvolver tudo do zero.
  • Leve seus produtos e serviços para um público mais amplo, melhorando a procura e exigindo uma maior capacidade de entrega!

 CCR - ccr.intersystems.com 

Público

  • Organizações selecionadas que gerenciam as alterações feitas em uma implementação da InterSystems (funcionários, parceiros e usuários finais)

Descrição

  • Change Control Record
    • Aplicativo de fluxo de trabalho personalizado integrado na sua própria tecnologia para monitorar todas as personalizações dos produtos de saúde da InterSystems instalados no mundo todo.
  • Versionamento e implantação de código personalizado no local e alterações na configuração.
  • Vários níveis e opções de configuração de fluxo de trabalho.
  • Bastante adaptável para atender às necessidades específicas da fase do projeto

Como isso ajuda a melhorar sua técnica

  • Para equipes com o uso autorizado, encontre e reutilize código ou planos de implementação na sua organização, evitando precisar resolver o mesmo problema várias vezes.
  • Resolva problemas na produção com muito mais rapidez, deixando mais tempo para o trabalho de desenvolvimento. 

 Client Connection - client.intersystems.com  

Público

  • Disponível para qualquer cliente do TrakCare

Descrição

  • InterSystems Client Connection é uma plataforma de colaboração e compartilhamento de conhecimento para clientes do TrakCare.
  • Comunidade online para clientes do TrakCare desenvolvem conexões melhores e mais próximas.
  • Em Client Connection, você encontrará o seguinte: 
    • Notícias e eventos do TrakCare 
    • Materiais de lançamentos do TrakCare, por exemplo, documentação de versões e vídeos de prévia
    • Acesso a guias de produtos atualizados.
    • Materiais de suporte para desenvolver o conhecimento pessoal.
    • Fóruns de discussão para aproveitar o conhecimento de colegas. 

Como isso ajuda a melhorar sua técnica

  • Os especialistas técnicos e de aplicativos nos sites do TrakCare podem compartilhar perguntas e conhecimentos rapidamente, se conectando com outros usuários do mundo todo.  Com respostas mais rápidas, sobra mais tempo para desenvolver soluções!

 Pedidos online - store.intersystems.com

Público

  • Usuários de operações em parceiros/usuários finais de aplicativos selecionados

Descrição

  • Permita que os clientes escolham diferentes produtos de acordo com seus contratos e façam novos pedidos.  
  • Permita que os clientes atualizem/troquem pedidos existentes.
  • Envie pedidos às Operações de Clientes da InterSystems para processá-los para entrega e faturamento.
  • Permita que os clientes migrem as licenças existentes para o InterSystems IRIS.

Como isso ajuda a melhorar sua técnica

  • Honestamente, não ajuda!  É uma ferramenta usada pela equipe de operações, e não usuários técnicos, mas está incluída aqui para ficar completo, já que o acesso é controlado por uma conta de login da InterSystems ;)  

Outras coisas que você deve saber sobre sua conta de login da InterSystems

Aqui estão mais alguns fatos úteis sobre as contas de login da InterSystems...

Como criar uma conta de login

Os usuários podem criar sua própria conta ao clicar em "Create Account" em qualquer aplicativo da InterSystems voltado ao público, incluindo:

Como alternativa, o FRC (First Response Center) da InterSystems criará uma conta de login para clientes atendidos pela primeira vez que precisarem acessar a Central de Suporte (WRC) ou o iService (os clientes atendidos também podem criar contas para os colegas).

Antes de usar a conta, o usuário precisa aceitar os Termos e Condições, durante o processo de autoinscrição ou no primeiro login.

Opções alternativas de login

Alguns aplicativos permitem o login com o Google ou GitHub:

É a mesma conta de login da InterSystems, mas com a autenticação pelo Google ou GitHub.

Perfil da conta

Se você for até https://Login.InterSystems.com e fizer a autenticação, poderá acessar Opções > Profile e fazer alterações básicas na sua conta.  O e-mail pode ser alterado em Options > Change Email.  

Como resolver problemas da conta de login

Os problemas das contas de login da InterSystems devem ser encaminhados para Support@InterSystems.com.  Inclua o seguinte:

  • Nome de usuário utilizado na tentativa de login
  • E-mail
  • Tipo e versão do navegador
  • Mensagens e/ou capturas de tela do erro específico
  • Data e hora do erro recebido   
0
0 146
Artigo Danusa Calixto · Set. 1, 2023 3m read

O InterSystems IRIS 2022.2 tem um SDK Nativo para Python (https://docs.intersystems.com/iris20222/csp/docbook/Doc.View.cls?KEY=PAGE_python_native).

Sabemos como percorrer uma estrutura de dados global usando a função $Order do ObjectScript do IRIS.

SET key=""FOR  {
     SET key=$ORDER(^myglobal(key)) 
     QUIT:key=""WRITE !,^myglobal(key)
   }

Como fazer o mesmo no Python usando o SDK Nativo do IRIS para Python? Aqui está um exemplo de código:

import iris

args = {'hostname':'127.0.0.1', 'port':51772,
    'namespace':'USER', 'username':'_SYSTEM', 'password':'SYS'
    }

conn = iris.connect(**args)

# Create an iris object
irispy = iris.createIRIS(conn)

# Create a global array in the USER namespace on the server
irispy.set('A', 'root', 'foo', 'SubFoo')

irispy.set(123, 'root', 'bar', 'lowbar', 'UnderBar')
irispy.set(124, 'root', 'bar', 'lowbar', 'UnderBar2')
irispy.set("hi", 'root', 'bar', 'lowbar')
irispy.set("hi again", 'root', 'bar3')

# Read the values from the database and print them
subfoo_value = irispy.get('root', 'foo', 'SubFoo')
underbar_value = irispy.get('root', 'bar', 'lowbar', 'UnderBar')
underbar2_value = irispy.get('root', 'bar', 'lowbar', 'UnderBar2')
lowbar_value = irispy.get('root', 'bar', 'lowbar')
bar3_value = irispy.get('root', 'bar3')

print('Created two values: ')

print('   root("foo","SubFoo")=', subfoo_value)
print('   root("bar","lowbar","UnderBar")=', underbar_value)
print('   root("bar","lowbar","UnderBar2")=', underbar2_value)
print('   root("bar","lowbar")=', lowbar_value)
print('   root("bar3")=', bar3_value)

direction = 0# direction of iteration (boolean forward/reverse)
next_sub = chr(0) # start at first possible subscript
subs = []

print("\n Iterating root \n")

isDef = irispy.isDefined('root', *subs)

while isDef:

    next_sub = irispy.nextSubscript(False, 'root', *subs, next_sub) # get first subscriptif next_sub == None: # we finished iterating nodes on this tree branch, move a level upif len(subs) == 0: # no more things to iteratebreak
        next_sub = subs.pop(-1) # pop last subscript in order to continue iterating this levelif irispy.isDefined('root', *subs, next_sub) == 11:
            print('root(',*subs, next_sub, ')=',irispy.get('root', *subs, next_sub))
            continuecontinue
    isDef = irispy.isDefined('root', *subs, next_sub)

    if isDef in [10, 11]: # keep building subscripts for depth first search
        subs.append(next_sub)
        next_sub = chr(0)
        continueelif isDef == 1: # reached a leaf node, print it
        print('root(',*subs, next_sub, ')=',irispy.get('root', *subs, next_sub))
    else: # def 0 is not really expected
         print("error")
         irispy.kill('root')
         conn.close()
         exit(-1)

        

# Delete the global array and terminate
irispy.kill('root') # delete global array root
conn.close()
0
0 85
Anúncio Angelo Bruno Braga · Mar. 31, 2022

 A InterSystems está feliz em anunciar a versão 2.0.0 do Servidor de Idiomas para VS Code. O Servidor de Idiomas aprimora a extensão VS Code para ObjectScript disponibilizando uma melhor coloração para sintaxes, documentação incorporada, conclusão de código e mais. Informações detalhadas estão disponíveis no arquivo README do repositório no GitHub. A versão 2.0.0 adiciona suporte para várias novas arquiteturas da plataforma incluindo Macs M1! Ela também reduz o tamanho do pacote, melhora a coloração no SQL e corrige uma série de problemas detalhados no CHANGELOG. 

0
0 86